慢sql定位及分析


1、查看慢查詢日志是否打開

mysql > show variables like '%slow_query_log';

 

 

2、上圖顯示慢日志是關着的,使用如下命令打開;

mysql > set global slow_query_log='ON';

3、再次查詢,慢日志已打開

 

 

4、查看慢日志閾值時間,顯示為10s;

mysql > show variables like '%long_query_time%';

 

 

5、設置慢查詢時間為3s;

mysql > set global long_query_time = 3;  sql執行時間大於3s的將會寫到慢日志中

 

 

6、我們可以使用 MySQL 自帶的 mysqldumpslow 工具統計慢查詢日志(這個工具是個 Perl 腳本,你需要先安裝好 Perl)。

 mysqldumpslow 命令的具體參數如下:

  -s:采用 order 排序的方式,排序方式可以有以下幾種。分別是 c(訪問次數)、t(查詢時間)、l(鎖定時間)、r(返回記錄)、ac(平均查詢次數)、al(平均鎖定時間)、ar(平均返回記錄數)和 at(平均查詢時間)。其中 at 為默認排序方式。

 -t:返回前 N 條數據 。

-g:后面可以是正則表達式,對大小寫不敏感。

比如我們想要按照查詢時間排序,查看前兩條 SQL 語句,這樣寫即可:

perl mysqldumpslow.pl -s t -t 2 "C:\ProgramData\MySQL\MySQL Server 8.0\Data\DESKTOP-4BK02RP-slow.log"

 

 


能看到開啟了慢查詢日志,並設置了相應的慢查詢時間閾值之后,只要查詢時間大於這個閾值的 SQL 語句都會保存在慢查詢日志中,然后我們就可以通過 mysqldumpslow 工具提取想要查找的 SQL 語句了。

 

7、使用 EXPLAIN 查看執行計划

EXPLAIN SELECT comment_id, product_id, comment_text, product_comment.user_id, user_name FROM product_comment JOIN user on product_comment.user_id = user.user_id

 

 


EXPLAIN 可以幫助我們了解數據表的讀取順序、SELECT 子句的類型、數據表的訪問類型、可使用的索引、實際使用的索引、使用的索引長度、上一個表的連接匹配條件、被優化器查詢的行的數量以及額外的信息(比如是否使用了外部排序,是否使用了臨時表等)等。

SQL 執行的順序是根據 id 從大到小執行的,也就是 id 越大越先執行,當 id 相同時,從上到下執行。

數據表的訪問類型所對應的 type 列是我們比較關注的信息。type 可能有以下幾種情況:

 

 

 
在這些情況里,all 是最壞的情況,因為采用了全表掃描的方式。index 和 all 差不多,只不過 index 對索引表進行全掃描,這樣做的好處是不再需要對數據進行排序,但是開銷依然很大。如果我們在 Extral 列中看到 Using index,說明采用了索引覆蓋,也就是索引可以覆蓋所需的 SELECT 字段,就不需要進行回表,這樣就減少了數據查找的開銷。

 


免責聲明!

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



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