MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL

2020-12-16 王者小哆啦

一條SQL查詢語句在經過MySQL查詢優化器處理後會生成一個所謂的執行計劃,這個執行計劃展示了具體執行查詢的方式,比如多表連接的順序是什麼,對於每個表採用什麼訪問方法來具體執行查詢等等。

本章的內容就是為了幫助大家看懂EXPLAIN語句的各個輸出項都是幹嘛使的,從而可以有針對性的提升我們查詢語句的性能。

學習步驟

定位慢查詢。使用explain分析。定位慢查詢SQL

在平時工作中,我想你肯定遇到過一條sql發出去了,但是等了好久才出現了返回值,這不僅僅影響了測試速度也大大降低了開發效率。所以我們有必要學習sql慢查詢定位。

一般定位慢查詢會有兩種解決方案:

根據慢查詢日誌定位使用show processlist定位,查詢正在執行的慢查詢NO.1 慢查詢日誌定位解析

MySQL 的慢查詢日誌記錄的內容是:在 MySQL 中響應時間超過參數 long_query_time(單位秒,默認值 10)設置的值並且掃描記錄數不小於 min_examined_row_limit(默認值0)的語句。

NOTE:默認情況下,慢查詢日誌中不會記錄管理語句,如果需要記錄的請做如下設置,設置log_slow_admin_statements = on 讓管理語句中的慢查詢也會記錄到慢查詢日誌中。默認情況下,也不會記錄查詢時間不超過 long_query_time 但是不使用索引的語句,可通過配置log_queries_not_using_indexes = on 讓不使用索引的 SQL 都被記錄到慢查詢日誌中(即使查詢時間沒超過 long_query_time 配置的值)。

慢查詢日誌使用步驟:

使用慢查詢日誌,一般分為四步:

開啟慢查詢日誌。設置慢查詢閥值。確定慢查詢日誌路徑。確定慢查詢日誌的文件名。開啟慢查詢日誌(默認是關閉的):

mysql> set global slow_query_log = on;

Query OK, 0 rows affected (0.00 sec)

設置慢查詢時間限制(查詢時間只要大於這個值都將記錄到慢查詢日誌中,單位:秒):

mysql> set global long_query_time = 1;

Query OK, 0 rows affected (0.00 sec)

確定慢查詢日誌路徑:

mysql> show global variables like "datadir";

確定慢查詢日誌文件名:

mysql> show global variables like "slow_query_log_file";

NOTE:慢查詢query time設置小技巧:線上業務一般建議把 long_query_time 設置為 1 秒,如果某個業務的 MySQL 要求比較高的 QPS,可設置慢查詢為 0.1 秒。發現慢查詢及時優化或者提醒開發改寫。一般測試環境建議 long_query_time 設置的閥值比生產環境的小,比如生產環境是 1 秒,則測試環境建議配置成 0.5 秒。便於在測試環境及時發現一些效率低的 SQL。甚至某些重要業務測試環境 long_query_time 可以設置為 0,以便記錄所有語句。並留意慢查詢日誌的輸出,上線前的功能測試完成後,分析慢查詢日誌每類語句的輸出,重點關注 Rows_examined(語句執行期間從存儲引擎讀取的行數),提前優化。

接下來在確定慢查詢日誌後可以通過:tail -n5 /data/mysql/mysql-slow.log 命令查看

執行結果

這裡對上方的執行結果詳細描述一下:

tail -n5:只查看慢查詢文件的最後5行Time:慢查詢發生的時間User@Host:客戶端用戶和IPQuery_time:查詢時間Lock_time:等待表鎖的時間Rows_sent:語句返回的行數Rows_examined:語句執行期間從存儲引擎掃描的行數上面這種方式是用系統自帶的慢查詢日誌查看的,如果覺得系統自帶的慢查詢日誌不方便查看,小夥伴們可以使用 pt-query-digest 或者 mysqldumpslow 等工具對慢查詢日誌進行分析,這不是本節重點,不演示了。

通過 show processlist定位慢查詢

有時慢查詢正在執行,已經導致資料庫負載偏高了,而由於慢查詢還沒執行完,因此慢查詢日誌還看不到任何語句。此時可以使用 show processlist 命令判斷正在執行的慢查詢。show processlist 顯示哪些線程正在運行。如果有 PROCESS 權限,則可以看到所有線程。否則,只能看到當前會話的線程。

知識擴展:如果不使用 FULL 關鍵字,在 info 欄位中只顯示每個語句的前 100 個字符,如果想看語句的全部內容可以使用 full 修飾(show full processlist)。

這裡對上面結果重點參數解釋一下:

Time:表示執行時間Info:表示 SQL 語句我們這裡可以通過它的執行時間(Time)來判斷是否是慢 SQL。

EXLPAIN分析慢查詢

分析 SQL 執行效率是優化 SQL 的重要手段,通過上面講的兩種方法,定位到慢查詢語句後,我們就要開始分析 SQL 執行效率了,子曾經曰過:「工欲善其事,必先利其器」,我們可以通過 explain、show profile 和 trace 等診斷工具來分析慢查詢。本節先講解 explain 的使用,在下節將分享 show profile 和 trace 的使用。

Explain 可以獲取 MySQL 中 SQL 語句的執行計劃,比如語句是否使用了關聯查詢、是否使用了索引、掃描行數等。可以幫我們選擇更好地索引和寫出更優的 SQL 。使用方法:在查詢語句前面加上 explain 運行就可以了。

創建一個測試表並且插入部分數據用於測試

在上圖表中我們創建了3個索引

PRIMARY KEY (`id`), 聚集索引 KEY `idx_a` (`a`),非聚集索引 KEY `idx_b_c` (`b`,`c`)非聚集索引 d列沒有創建索引

執行三個SQL分別得到如下結果

Explain欄位詳解(重點關注加粗項):

這幾列重點解讀:

1. select_type重點解讀

2. type重點解讀:查詢性能從上到下依次是最好到最差

3. extra重點解讀

總結

今天我分享的關於定位慢 SQL 及使用 explain 分析慢 SQL 到這裡就結束了。

本節知識點總結如下:

學習了兩種慢查詢定位方法。掌握了explain關鍵列的含義以及使用方法,這也是工作中最常用的方法。在工作中及面試時,SQL 性能優化都是我們經常遇到的問題,要想做好性能優化,我們必須學會使用 SQL 優化時需要的工具,進行定位和分析。

由於篇幅的問題,本小節只介紹了 explain 工具的使用,在下節將補充另外兩種分析慢查詢的工具:show profile 和 trace。在後面我會再講解 SQL 優化的一些知識點,相信小夥伴們 SQL 性能優化時一定可以越來越熟練。

最後小夥伴們可以將處理問題時的心得體會進行總結,也歡迎給我留言分享,我們一起來交流、學習、進步。

相關焦點

  • MySQL優化:學會使用show profile和trace分析慢查詢
    MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL在上一節我們學習了定位慢 SQL 及使用 explain 分析慢 SQL,我們也提到了分析慢 SQL 還有 show profile 和 trace 等方法,本節就重點補充學習這兩種方法。
  • 使用explain和show profile來分析SQL語句實現優化SQL語句
    SQL語句優化是建立在慢查詢分析的基礎上,通過慢查詢定位有問題的SQL語句,關於慢查詢的介紹及其分析工具,可以參考[mysql慢查詢及慢查詢日誌分析工具]一、通過explain查詢1 用法:explain sql2 作用:用於分析sql語句
  • mysql 慢查詢命令
    如何查找MySQL中查詢慢的SQL語句更多如何在mysql查找效率慢的SQL語句呢?這可能是困然很多人的一個問題,MySQL通過慢查詢日誌定位那些執行效率較低的SQL 語句,用--log-slow-queries[=file_name]選項啟動時,mysqld 會寫一個包含所有執行時間超過long_query_time 秒的SQL語句的日誌文件,通過查看這個日誌文件定位效率較低的SQL 。
  • mysql性能分析explain之id詳解
    前言在mysql的編程世界裡,有時候我們往往需要對自己編寫的sql語句進行分析,來去查看sql的執行計劃,這個還是很有必要的。因為我們在開發中,往往需要從資料庫中查詢數據,當數據量一旦大的時候,這個時候就會出現查詢瓶頸,我們首先呢可能就會去查看我們的sql語句的執行過程,判斷是否可進行優化,那如何去定位分析呢?這個就是本文講到的使用explain工具來去定位分析。
  • 一次神奇的 sql 查詢經歷,group by 慢查詢優化記錄
    一、問題背景  現網出現慢查詢,在500萬數量級的情況下,單表查詢速度在30多秒,需要對sql進行優化,sql如下:  哎,現在發現了,只有用sqlyog執行這個「優化後」的sql會是0.8秒,在navicat和伺服器上直接執行,都是30多秒。  那就是sqlyog的問題了,現在也不清楚sqlyog是不是做什麼優化了,這個慢查詢的問題還在解決中(我覺得問題可能是出在mysql自身的參數上吧)。
  • mysql的explain詳解
    然後我改了一下sql,重新explain一下結果,如下:explain SELECT * FROM article force index(idx_1) WHERE (id < 4054495) AND (book_id = '5164') ORDER BY id desc LIMIT 1\G;
  • 「MySQL系列」分析Sql執行時間及查詢執行計劃(附資料庫和一千萬數據)
    接下來這篇文章我們來看看如何分析我們的sql執行效率。首先找到執行慢的sql,然後對執行慢的SQL進行分析。在分析之前是不是有這樣的困惑,我的數據量這麼少。我如何分析SQL執行效率。不要慌,我們已準備了一千萬條數據。接下來看看如何將這一千萬條數據快速導入到資料庫中。
  • MySQL的limit用法和分頁查詢的性能分析及優化
    二、Mysql的分頁查詢語句的性能分析MySql分頁sql語句,如果和MSSQL的TOP語法相比,那麼MySQL的LIMIT語法要顯得優雅了許多。使用它來分頁是再自然不過的事情了。最基本的分頁方式:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
  • MySQL優化原理分析及優化方案總結
    在我們的記憶儲備裡也早已記住了這些關鍵詞:避免使用SELECT*、避免使用NULL值的判斷、根據需求適當的建立索引、優化MySQL參數.但是你對於這些優化技巧是否真正的掌握了及其相應的工作原理是否吃透了呢?在我們的實際開發過程中你能充分應用到嗎?我覺得還有待考察。所以,本文將詳細介紹MySQL優化技巧以及其相應的技術原理,希望大家看完以後,能更清楚直接的了解這些優化方案,並應用到我們的工作崗位中。
  • 《MySQL慢查詢優化》之SQL語句及索引優化
    1、慢查詢優化方式伺服器硬體升級優化Mysql伺服器軟體優化資料庫表結構優化SQL語句及索引優化>本文重點關注於SQL語句及索引優化,關於其他優化方式以及索引原理等,請關注本人《MySQL慢查詢優化》系列博文。
  • MySQL高級知識(四)——Explain
    explain(執行計劃),使用explain關鍵字可以模擬優化器執行sql查詢語句,從而知道MySQL是如何處理sql語句。explain主要用於分析查詢語句或表結構的性能瓶頸。註:本系列隨筆如無特殊說明都MySQL版本都為5.7.22。
  • 摘要:本文以具體案例分析了SQL查詢優化的處理方法。
    本文以具體案例分析了SQL查詢優化的處理方法。首先以具體案例進行了SQL語句問題的分析,然後給出了問題的解決辦法,最後結合MySQL資料庫在Nat123的應用案例進行了方法分析。出現問題的SQL語句,如圖:關聯查詢從上面簡化的SQL語句,可以看出,首先進行的是關聯查詢。
  • MySQL 的索引是什麼?怎麼優化?
    所以網際網路公司的數據做的是假刪除.一是為了做數據分析,二是為了不破壞索引 )3.數據過多(分庫分表)4.伺服器調優及各個參數設置(調整my.cnf)1.先觀察,開啟慢查詢日誌,設置相應的閾值(比如超過3秒就是慢SQL),在生產環境跑上個一天過後,看看哪些SQL比較慢。2.Explain和慢SQL分析。
  • MySQL慢日誌簡介及Anemometer工具介紹 | | For DBA
    ),或者需要全表/全索引掃描的SQL(如果設置了 log_queries_not_using_indexes 選項的話,並不是指所有沒使用索引的SQL),這些SQL效率通常較低,是可能影響MySQL的性能,DBA需要定期優化這些SQL。
  • SQL中EXPLAIN命令詳解
    explain裡面最關注以下幾列:type本次查詢表聯接類型,從這裡可以看到本次查詢大概的效率key最終選擇的索引,如果沒有索引的話,本次查詢效率通常很差key_len本次查詢用於結果過濾的索引實際長度
  • mysql┃多個角度說明sql優化,讓你吊打面試官!
    sql優化,最近moon一直在寫關於mysql的文章,包括之前寫的索引相關,其實也都是為了這篇文章做個鋪墊,所以你懂了嗎,今天我將從表結構、索引、查詢語句、分庫分表這四個維度來和大家聊聊,在工作中,怎麼進行sql優化?
  • 總結MySQL 8種性能優化方式
    索引的優缺點:優點:某些情況下使用select語句大幅度提高效率,合適的索引可以優化MySQL伺服器的查詢性能,從而起到優化MySQL的作用。缺點:表行數據的變化(index、update、delect),簡歷在表列上的索引也會自動維護,一定程度上會使DML操作變慢。索引還會佔用磁碟額外的存儲空間。
  • 面對MySQL 查詢索引失效,程式設計師的六大優化技巧!
    但是,你寫SQL語句的時候,並沒有主動指定使用哪個索引。不知道你有沒有碰到過這種情況,一條創建了索引的SQL語句在查詢過程中卻沒有使用索引,或是一條本來可以執行的很快的語句,卻由於MySQL選錯了索引,而導致查詢速度變得很慢?充分優化和利用索引能夠大大提高數據的查詢效率,但是在實際的應用中MySQL可能並不總會選擇合適且效率高的索引。
  • 什麼是MySQL的執行計劃(Explain關鍵字)?
    (注意,如果 from 中包含子查詢,仍會執行該子查詢,將結果放入臨時表中)。Explain可以用來分析SQL語句和表結構的性能瓶頸。通過explain的結果,可以了解到如數據表的查詢順序、數據查詢操作的操作類型、哪些索引可以被命中、哪些索引實際會命中、每個數據表有多少行記錄被查詢等信息。
  • MYSQL優化 學習筆記
    分析你的查詢語句或是表結構的性能瓶頸Explain能幹嘛key  列顯示使用了哪個索引一般就是在你的 where 語句中出現 了 between、<、>、in  等的查詢這種範圍掃描索引掃描比全表掃描要好,因為它只需要開始於索引的某一點,而 結束語另一點,不用掃描全部索引INDEX出現index是sql使用了索引但是沒用通過索引進行過濾,一般是使用了覆蓋索引或者是利用索引進行了排序分組ALLFull Table Scan,將遍歷全表以找到匹配的行