1、使用 show status 瞭解各種 SQL 的執行頻率 mysql> show status like ‘Com_%’; 該命令可以查詢 sql 命令的執行次數。 2、定位執行效率較低的 SQL 語句 定位 SQL 執行效率低的 SQL 一般有兩種方法: 3、通過 explain 分析低效 ...
1、使用 show status 瞭解各種 SQL 的執行頻率
mysql> show status like ‘Com_%’;
該命令可以查詢 sql 命令的執行次數。
2、定位執行效率較低的 SQL 語句
定位 SQL 執行效率低的 SQL 一般有兩種方法:
- 通過慢查詢日誌定位效率低的 SQL ,用 --log-slow-queries[= file_name] 該選項啟動;
- 慢查詢日誌在查詢結束後才會記錄,所以在應用執行效率出現問題的時候慢查詢日誌不能定位問題,這時可以使用 show processlist 命令查看當前 MySQL 在執行的線程,包括線程的狀態、是否鎖表等,可以實時地查看 SQL 的執行情況,同時對一些鎖表操作進行優化;
3、通過 explain 分析低效 SQL 的執行計劃
ALL | index | range | ref | eq_ref | const, system | NULL |
以上常見的訪問類型 從左至右,性能由差到好。
- ALL:全表掃描, MySQL 遍歷全表來匹配行;
- index:索引掃描,MySQL 遍歷整個索引來查詢匹配的行;
- range:索引範圍掃描,常見於 <、<=、>、>=、between 等操作符;
- ref:使用非唯一索引掃描或唯一索引的首碼掃描,返回匹配某個單獨值的記錄行;
- eq_ref:類似 ref,區別就在使用的索引是唯一索引,對於每個索引鍵值,表中只有一條記錄匹配;簡單來說,就是多表連接中使用 primary key 或 unique index 作為關聯條件;
- const / system:單表中最多有一個匹配行,查詢非常迅速,所以這個匹配行中的其它列的值可以被優化器在當前查詢中當作常量來處理,例如,根據主鍵 primary key 或 唯一索引 unique index 進行查詢;
- NULL:MySQL 不用訪問表或索引,直接就能得到結果;
在 MySQL 4.1 引入了 explain extended 命令,通過該命令加上 show warnings,我們能夠得到 SQL 在真正執行之前優化器做了哪些 SQL 改寫。