MySQL優化


一、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;

五、定位慢查詢

MySQL慢查詢

六、分區

MySQL分區和分表

七、配置優化

MySQL配置優化

查看更多:
MySQL各存儲引擎
MySQL鎖詳解
MySQL事務
MySQL索引類型


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM