要找出mysql中低效的sql語句我們可以使用 EXPLAIN分析低效sql,但是在使用 EXPLAIN之前我需要開啟mysql慢查詢日志,這樣才可以使用 EXPLAIN,下面我們一起來看看。
面對業務的迅猛發展,DBA的一項重要工作就是及時發現數據庫中的低效SQL語句,有的可以立刻著手解決(比如缺少合適的索引),有的需要盡快反饋給開發人員進行修改。
MySQL數據庫有幾個配置選項可以幫助我們及時捕獲低效SQL語句:
1,slow_query_log
這個參數設置為ON,可以捕獲執行時間超過一定數值的SQL語句。
2,long_query_time
當SQL語句執行時間超過此數值時,就會被記錄到日志中,建議設置為1或者更短。
3,slow_query_log_file
記錄日志的文件名。
4,log_queries_not_using_indexes
這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,盡管這個SQL語句有可能執行得挺快。
Windows下開啟MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.ini找到[mysqld]下面加上
代碼如下 復制代碼 log-slow-queries = F:/MySQL/log/mysqlslowquery.log
Linux下啟用MySQL慢查詢
MySQL在Windows系統中的配置文件一般是是my.cnf找到[mysqld]下面加上
代碼如下 復制代碼 log-slow-queries=/data/mysqldata/slowquery.log注意
log-slow-queries = F:/MySQL/log/mysqlslowquery.log為慢查詢日志存放的位置,一般這個目錄要有MySQL的運行帳號的可寫權限,一般都將這個目錄設置為MySQL的數據存放目錄;
long_query_time=2中的2表示查詢超過兩秒才記錄;
配置好上述幾個參數後,我們就可以監視日志,然後著手進行解決了,如下
通過 EXPLAIN 分析低效 SQL的執行計劃:
通過以上步驟查詢到效率低的SQL後,我們可以通過explain或者desc 獲取MySQL如何執行SELECT語句的信息,包括select語句執行過程表如何連接和連接的次序。
explain可以知道什麼時候必須為表加入索引以得到一個使用索引來尋找記錄的更快的SELECT。
select_type:select 類型
table:輸出結果集的表
type:表示表的連接類型
當表中僅有一行是type的值為system是最佳的連接類型;
當select操作中使用索引進行表連接時type的值為ref;
當select的表連接沒有使用索引時,經常會看到type的值為ALL,表示對該表進行了全表掃描,這時需要考慮通過創建索引來提高表連接的效率。
possible_keys: 表示查詢時,可以使用的索引列.
key:表示使用的索引
key_len:索引長度
rows:掃描范圍
Extra:執行情況的說明和描述
確定問題,並采取相應的優化措施:
經過以上步驟,基本可以確認問題出現的原因,可以根據情況采取相應的措施,進行優化提高執行的效率。
例如上面的例子,我們確認是對a表的全表掃描導致效率的不理想,我們對a表的year字段創建了索引,查詢需要掃描的行數明顯較少。
mysql> explain select sum(moneys) from sales a,companys b where a.company_id =
b.id and a.year = 2006;
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| select_type| table | type | possible_keys| key| key_len|rows
| Extra|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| SIMPLE| b| index | PRIMARY| PRIMARY| 4|1 | Using index
|
| SIMPLE| a| ref| year| year| 4|3 |Using
where|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
2 rows in set (0.02 sec)