<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何定位 MySQL 慢查詢?

          共 2920字,需瀏覽 6分鐘

           ·

          2020-11-25 08:24

          相信大家在平時工作中都有過 SQL 優(yōu)化經(jīng)歷,那么在優(yōu)化前就必須找到慢 SQL 方可進行分析。這篇文章就介紹下如何定位到慢查詢。

          慢查詢?nèi)罩臼?MySQL 內(nèi)置的一項功能,可以記錄執(zhí)行超過指定時間的 SQL 語句。

          以下是慢查詢的相關(guān)參數(shù),大家感興趣的可以看下:

          參數(shù)含義
          log_output日志輸出位置,默認為 FILE,即保存為文件,若設(shè)置為 TABLE,則將日志記錄到 mysql.show_log 表中,支持設(shè)置多種格式
          slow_query_log_file指定慢查詢?nèi)罩疚募穆窂胶兔?,可使用絕對路徑指定,默認值是主機名-slow.log,位于配置的 datadir 目錄
          long_query_time執(zhí)行時間超過該值才記錄到慢查詢?nèi)罩?,單位為秒,默認為 10
          min_examined_row_limit對于查詢掃描行數(shù)小于此參數(shù)的SQL,將不會記錄到慢查詢?nèi)罩局?,默認為 0
          log_queries_not_using_indexes是否將未使用索引的 SQL 記錄到慢查詢?nèi)罩局校_啟此配置后會無視 long_query_time 參數(shù),默認為 OFF
          log_throttle_queries_not_using_indexes設(shè)定每分鐘記錄到日志的未使用索引的語句數(shù)目,超過這個數(shù)目后只記錄語句數(shù)量和花費的總時間,默認為 0
          log-slow-admin-statements記錄執(zhí)行緩慢的管理 SQL,如 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE,默認為 OFF
          log_slow_slave_statements記錄從庫上執(zhí)行的慢查詢語句,如果 binlog 的值為 row,則失效,默認為 OFF

          開啟慢查詢

          有兩種方式可以開啟慢查詢

          1. 修改配置文件
          2. 設(shè)置全局變量

          方式一需要修改配置文件 my.ini,在[mysqld]段落中加入如下參數(shù):

          [mysqld]
          log_output='FILE,TABLE'
          slow_query_log='ON'
          long_query_time=0.001

          然后需要重啟 MySQL 才可以生效,命令為 service mysqld restart

          方式二無需重啟即可生效,但是重啟會導(dǎo)致設(shè)置失效,設(shè)置的命令如下所示:

          SET?GLOBAL?slow_query_log?=?'ON';
          SET?GLOBAL?log_output?=?'FILE,TABLE';
          SET?GLOBAL?long_query_time?=?0.001;

          這樣就可以將慢查詢?nèi)罩就瑫r記錄在文件以及 mysql.slow_log 表中。

          通過第二種方式開啟慢查詢?nèi)罩荆缓笫褂萌聿樵冋Z句 SELECT * FROM user

          然后再查詢慢查詢?nèi)罩荆?code style="font-size: 14px;overflow-wrap: break-word;padding-top: 2px;padding-bottom: 2px;margin-right: 2px;margin-left: 2px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;background-image: initial;background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;border-radius: 0px;color: rgb(235, 97, 97);border-bottom: 1px solid rgb(235, 97, 97);">SELECT * FROM mysql.slow_log,可以發(fā)現(xiàn)其中有這樣一條記錄:

          slow_log

          其中,start_time 為執(zhí)行時間,user_host 為用戶的主機名,query_time 為查詢所花費的時間,lock_time 為該查詢使用鎖的時間,rows_sent 為這條查詢返回了多少數(shù)據(jù)給客戶端,rows_examined 表示這條語句掃描了多少行,db 為數(shù)據(jù)庫,sql_text 為這條 SQL,thread_id 為執(zhí)行這條查詢的線程 id。

          這樣我們就可以通過 slow_log 表的數(shù)據(jù)進行分析,然后對 SQL 進行調(diào)優(yōu)了。

          以上是通過 Table 來進行分析的,下面來通過文件的慢查詢是怎么樣的。

          如果不知道文件保存在哪里,可以使用 SHOW VARIABLES LIKE '%slow_query_log_file%' 來查看文件保存位置,打開慢查詢?nèi)罩疚募?,可以看出每五行表示一個慢 SQL,這樣查看比較費事,可以使用一些工具來查看。

          慢查詢?nèi)罩疚募?/figcaption>

          mysqldumpslow

          MySQL 內(nèi)置了 mysqldumpslow 這個工具來幫助我們分析慢查詢?nèi)罩疚募琖indows 環(huán)境下使用該工具需要安裝 Perl 環(huán)境。

          可以通過 -help 來查看它的命令參數(shù):

          mysqldumpslow help

          比如我們可以通過 mysqldumpslow -s t 10 LAPTOP-8817LKVE-slow.log 命令得到按照查詢時間排序的 10 條 SQL 。

          mysqldumpslow 結(jié)果

          pt-query-digest

          除此之外還有 pt-query-digest,這個是 Percona Toolkit 中的工具之一,下載地址:https://www.percona.com/downloads/percona-toolkit/LATEST/,如果是 Windows 系統(tǒng),可以在安裝 Perl 的環(huán)境下,把腳本下載下來:https://raw.githubusercontent.com/percona/percona-toolkit/3.x/bin/pt-query-digest

          下面先對 pt-query-digest 進行簡單的介紹:

          pt-query-digest 是用于分析 MySQL 慢查詢的一個第三方工具,可以分析 binlog、General log 和 slowlog,也可以通過 showprocesslist 或者通過 tcpdump 抓取的 MySQL 協(xié)議數(shù)據(jù)來進行分析,可以把分析結(jié)果輸出到文件中,分析過程是先對查詢語句的條件進行參數(shù)化,然后對參數(shù)化以后的查詢進行分組統(tǒng)計,統(tǒng)計出各查詢的執(zhí)行時間、次數(shù)、占比等,可以借助分析結(jié)果找出問題進行優(yōu)化。

          有興趣的可以先下載下來自己玩玩,將在后續(xù)的文章中對 pt-query-digest 工具進行詳細介紹。

          show processlist

          還有種情況是慢查詢還在執(zhí)行中,慢查詢?nèi)罩纠锸钦也坏铰?SQL 呢,這個時候可以用 show processlist 命令來尋找慢查詢,該命令可以顯示正在運行的線程,執(zhí)行結(jié)果如下圖所示,可以根據(jù) Time 的大小來判斷是否為慢查詢。

          show processlist

          總結(jié)

          這篇文章主要講解了如何定位慢查詢以及簡單介紹了 mysqldumpslowpt-query-digest 工具,后續(xù)還會講解 explain 和 ?show profile 以及 trace 等常用的方法。

          你在定位慢查詢或者優(yōu)化 SQL 時,都會用到哪些方法呢?

          感謝大家的閱讀,歡迎留言進行交流討論。

          最好的關(guān)系就是互相成就,大家的在看、轉(zhuǎn)發(fā)、留言三連就是我創(chuàng)作的最大動力。

          參考文檔

          https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

          瀏覽 43
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品视频免费看 | 三级成人AV在线电影 | 久草免费极品盛宴 | 91精品国产91久久久久久 | 日欧美在线视频 |