(1)使用limit對查詢結果的記錄進行限定
(2)避免select *,將須要查找的字段列出來
(3)使用鏈接(join)來代替子查詢
(4)拆分大的delete或insert語句html
(1)使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob
(2)使用簡單的數據類型,整型比字符處理開銷更小,由於字符串的比較更復雜。如,int類型存儲時間類型,bigint類型轉ip函數
(3)使用合理的字段屬性長度,固定長度的表會更快。使用enum、char而不是varchar
(4)儘量使用not null定義字段
(5)儘可能少用text,非用不可最好分表mysql
(1)查詢頻繁的列,在where,group by,order by,on從句中出現的列
(2)where條件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出現的列
(3)長度小的列,索引字段越小越好,由於數據庫的存儲單位是頁,一頁中能存下的數據越多越好
(4)離散度大(不一樣的值多)的列,放在聯合索引前面。查看離散度,經過統計不一樣的列值來實現,count越大,離散程度越高:sql
mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;
(1)SHOW查看狀態
1.顯示狀態信息數據庫
mysql> SHOW [SESSION|GLOBAL] STATUS LIKE '%Status_name%';
session(默認):取出當前窗口的執行
global:從mysql啓動到如今
(a)查看查詢次數(插入次數com_insert、修改次數com_insert、刪除次數com_delete)session
mysql> SHOW STATUS LIKE 'com_select';
(b)查看鏈接數(登陸次數)函數
mysql> SHOW STATUS LIKE 'connections';
(c)數據庫運行時間post
mysql> SHOW STATUS LIKE 'uptime';
(d)查看慢查詢次數優化
mysql> SHOW STATUS LIKE 'slow_queries';
(e)查看索引使用的狀況:spa
mysql> SHOW STATUS LIKE 'handler_read%';
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
handler_read_rnd_next:這個值越高,說明查詢低效。
2.顯示系統變量code
mysql> SHOW VARIABLES LIKE '%Variables_name%';
3.顯示InnoDB存儲引擎的狀態
mysql> SHOW ENGINE INNODB STATUS;
(2)EXPLAIN分析查詢
mysql> EXPLAIN SELECT column_name FROM table_name;
explain查詢sql執行計劃,各列含義:
table:表名;
type:鏈接的類型
-const:主鍵、索引;
-eq_reg:主鍵、索引的範圍查找;
-ref:鏈接的查找(join)
-range:索引的範圍查找;
-index:索引的掃描;
-all:全表掃描;
possible_keys:可能用到的索引;
key:實際使用的索引;
key_len:索引的長度,越短越好;
ref:索引的哪一列被使用了,常數較好;
rows:mysql認爲必須檢查的用來返回請求數據的行數;
extra:using filesort、using temporary(常出如今使用order by時)時須要優化。
-Using filesort 額外排序。看到這個的時候,查詢就須要優化了
-Using temporary 使用了臨時表。看到這個的時候,也須要優化
(3)PROFILING分析SQL語句
1.開啓profile。查看當前SQL執行時間
mysql> SET PROFILING=ON; mysql> SHOW profiles;
2.查看全部用戶的當前鏈接。包括執行狀態、是否鎖表等
mysql> SHOW processlist;
(4)PROCEDURE ANALYSE()取得建議
經過分析select查詢結果對現有的表的每一列給出優化的建議
mysql> SELECT column_name FROM table_name PROCEDURE ANALYSE();
(5)OPTIMIZE TABLE回收閒置的數據庫空間
mysql> OPTIMIZE TABLE table_name;
對於MyISAM表,當表上的數據行被刪除時,所佔據的磁盤空間並無當即被回收,使用命令後這些空間將被回收,而且對磁盤上的數據行進行重排(注意:是磁盤上,而非數據庫)。
對於InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,這會重建表。重建操做能更新索引統計數據並釋放成簇索引中的未使用的空間。
只需在批量刪除數據行以後,或按期(每週一次或每個月一次)進行一次數據表優化操做便可,只對那些特定的表運行。
(6)REPAIR TABLE修復被破壞的表
mysql> REPAIR TABLE table_name;
(7)CHECK TABLE檢查表是否有錯誤
mysql> CHECK TABLE table_name;