一、SQL語句優化
(1)使用limit對查詢結果的記錄進行限定
(2)避免select *,將需要查找的字段列出來
(3)使用連接(join)來代替子查詢
(4)拆分大的delete或insert語句
二、選擇合適的數據類型
(1)使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob
(2)使用簡單的數據類型,整型比字符處理開銷更小,因為字符串的比較更復雜。如,int類型存儲時間類型,bigint類型轉ip函數
(3)使用合理的字段屬性長度,固定長度的表會更快。使用enum、char而不是varchar
(4)盡可能使用not null定義字段
(5)盡量少用text,非用不可最好分表
三、選擇合適的索引列
(1)查詢頻繁的列,在where,group by,order by,on從句中出現的列
(2)where條件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出現的列
(3)長度小的列,索引字段越小越好,因為數據庫的存儲單位是頁,一頁中能存下的數據越多越好
(4)離散度大(不同的值多)的列,放在聯合索引前面。查看離散度,通過統計不同的列值來實現,count越大,離散程度越高:
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)
mysql> SHOW STATUS LIKE 'com_select';
(b)查看連接數(登錄次數)
mysql> SHOW STATUS LIKE 'connections';
(c)數據庫運行時間
mysql> SHOW STATUS LIKE 'uptime';
(d)查看慢查詢次數
mysql> SHOW STATUS LIKE 'slow_queries';
(e)查看索引使用的情況:
mysql> SHOW STATUS LIKE 'handler_read%';
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
handler_read_rnd_next:這個值越高,說明查詢低效。
2.顯示系統變量
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;