一、使用 show status 瞭解各類 SQL 的執行頻率
mysql> show status like 'Com%';
該命令能夠查詢 sql 命令的執行次數。mysql
二、定位執行效率較低的 SQL 語句
定位執行效率較低的 SQL 通常有兩種方法:sql
- 經過慢查詢日誌定位效率低的 SQL,用
--log-show-queries[=file_name]
該選項啓動;
- 慢查詢日誌在查詢結束後纔會記錄,因此在應用執行效率出現問題的時候慢查詢日誌不能定位問題,這時可使用
show processlist
命令查看當前 MySQL 在執行的線程,包括線程的狀態、是否鎖表等,能夠實時地查看 SQL 的執行狀況,同時對一些鎖表操做進行優化;
三、經過 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
在 MySQL 4.1 引入了 explain extended 命令,經過該命令加上 show warnings,咱們可以獲得 SQL 在真正執行以前優化器作了哪些 SQL 改寫。線程