成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

慢查詢 MySQL 定位優化技巧,從10s優化到300ms

數據庫 其他數據庫
我們可以用force index強制指定索引,然后去分析執行計劃看看哪個索引是更好的,因為查詢優化器選擇索引不一定是百分百準確的,具體情況可以根據實際場景分析來確定是否使用查詢優化器選擇的索引。

今天分享一下如何快速定位慢查詢SQL以及優化。

一、如何定位并優化慢查詢SQL?

一般有3個思考方向:

  • 根據慢日志定位慢查詢sql。
  • 使用explain等工具分析sql執行計劃。
  • 修改sql或者盡量讓sql走索引。

二、如何使用慢查詢日志?

先給出步驟,后面說明,有3個步驟

1. 開啟慢查詢日志

首先開啟慢查詢日志,由參數slow_query_log決定是否開啟,在MySQL命令行下輸入下面的命令:

set global slow_query_log=on;

默認環境下,慢查詢日志是關閉的,所以這里開啟。

2. 設置慢查詢閾值

set global long_query_time=1;

只要你的SQL實際執行時間超過了這個閾值,就會被記錄到慢查詢日志里面。這個閾值默認是10s,線上業務一般建議把long_query_time設置為1s,如果某個業務的MySQL要求比較高的QPS,可設置慢查詢為0.1s。

發現慢查詢及時優化或者提醒開發改寫。一般測試環境建議long_query_time設置的閥值比生產環境的小,比如生產環境是1s,則測試環境建議配置成0.5s。便于在測試環境及時發現一些效率的SQL。

甚至某些重要業務測試環境long_query_time?可以設置為0,以便記錄所有語句。并留意慢查詢日志的輸出,上線前的功能測試完成后,分析慢查詢日志每類語句的輸出,重點關注Rows_examined(語句執行期間從存儲引擎讀取的行數),提前優化。

3.確定慢查詢日志的文件名和路徑

show global variables like 'slow_query_log_file'

圖片

結果會發現慢日志默認路徑就是MySQL的數據目錄,我們可以來看一下MySQL數據目錄。

 show global variables like 'datadir';

圖片

不用關注這里為什么不是MySQL 8.0,這和版本沒什么關系的。

來,直接上菜,干巴巴的定義我自己都看不下去。

我們先來查看一下變量,我框出了需要注意的點。

查詢帶有quer的相關變量:

show global variables like '%quer%';

圖片

圖片

這里設置慢查詢閾值為1s:

set global long_query_time=1;

可以看到已經修改過來了:

圖片

但是重啟mysql客戶端設置和統計慢查詢日志條數就會清零,即所有配置修改會還原。

命令修改配置之后,在命令行net stop mysql?關閉MySQL服務,再net start mysql?開啟MySQL服務,接著執行show global variables like '%quer%';會發現配置還原了。

在配置文件修改才能永久改變,否則重啟數據庫就還原了。

3.慢查詢例子演示,新手都能看懂

數據表結構,偷懶沒寫comment:

CREATE TABLE `person_info_large` (  
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`account` VARCHAR (10),
`name` VARCHAR (20),
`area` VARCHAR (20),
`title` VARCHAR (20),
`motto` VARCHAR (50),
PRIMARY KEY (`id`),
UNIQUE(`account`),
KEY `index_area_title`(`area`,`title`)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8

這里的數據是200W條。請注意表結構,記住哪幾個字段有索引即可,后續圍繞這個表進行分析。

圖片

這個3.36s并不是實際執行時間,實際執行時間得去慢查詢日志去看Query_time參數。

圖片

可以看到Query_time: 6.337729s,超過了1s,所以會被記錄,一個select語句查詢這么久,簡直無法忍受。

圖中其他的參數解釋如下:

  • Time:慢查詢發生的時間
  • Query_time:查詢時間
  • Lock_time:等待鎖表的時間
  • Rows_sent:語句返回的行數
  • Rows_exanined:語句執行期間從存儲引擎讀取的行數。

上面這種方式是用系統自帶的慢查詢日志查看的,如果覺得系統自帶的慢查詢日志不方便查看,可以使用pt-query-digest?或者mysqldumpslow等工具對慢查詢日志進行分析。

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

四、查詢語句慢怎么辦?explain帶你分析sql執行計劃

根據上一節的表結構可以知道,account是添加了唯一索引的字段。explain分析一下執行計劃。

圖片

我們重點需要關注select_type、type、possible_keys、key、Extra?這些列,我們來一一說明,看到select_type?列,這里是SIMPLE簡單查詢,其他值下面給大家列出。

圖片

type列,這里是index,表示全索引掃描。

圖片

表格從上到下代表了sql查詢性能從最優到最差,如果是type類型是all,說明sql語句需要優化。

注意:如果type = NULL?,則表明個MySQL不用訪問表或者索引,直接就能得到結果,比如explain select sum(1+2);

possible_keys代表可能用到的索引列,key表示實際用到的索引列,以實際用到的索引列為準,這是查詢優化器優化過后選擇的,然后我們也可以根據實際情況強制使用我們自己的索引列來查詢。

Extra列,這里是Using index

圖片

圖片

一定要注意,Extra中出現Using filesort、Using temporary代表MySQL根本不能使用索引,效率會受到嚴重影響,應當盡可能的去優化。

出現Using filesort說明MySQL對結果使用一個外部索引排序,而不是從表里按索引次序讀到相關內容,有索引就維護了B+樹,數據本來就已經排好序了,這說明根本沒有用到索引,而是數據讀完之后再排序,可能在內存或者磁盤上排序。也有人將MySQL中無法利用索引的排序操作稱為“文件排序”。

出現Using temporary?表示MySQL在對查詢結果排序時使用臨時表,常見于order by?和分組查詢group by。

回到上一個話題,我們看到account是添加了唯一索引的字段。explain分析了執行計劃后。

圖片

直接按照account降序來查:

圖片

查看慢查詢日志發現,使用索引之后,查詢200W條數據的速度快了2s。

接著我們分析一下查詢name的sql執行計劃。

圖片

然后給name字段加上索引:

圖片

加上索引之后,繼續看看查詢name的sql執行計劃:

圖片

對比一下前面name不加索引時的執行計劃就會發現,加了索引后,type由ALL全表掃描變成index索引掃描。order by?并沒有 using filesort?,而是using index,這里B+樹已經將這個非聚集索引的索引字段的值排好序了,而不是等到查詢的時候再去排序。

接著我們繼續執行查詢語句,此時name已經是添加了索引的。

圖片

結果發現,name添加索引之前,降序查詢name是花費6.337729s,添加索引之后,降序查詢name花費了3.479827s,原因就是B+樹的結果集已經是有序的了。

圖片

五、當主鍵索引、唯一索引、普通索引都存在,查詢優化器如何選擇?

查詢一下數據的條數,這里count(id),分析一下sql執行計劃:

圖片

這里實際使用的索引是account唯一索引。

分析一下:實際使用哪個索引是查詢優化器決定的,B+樹的葉子結點就是鏈表結構,遍歷鏈表就可以統計數量,但是這張表,有主鍵索引、唯一索引、普通索引,優化器選擇了account這個唯一索引,這肯定不會使用主鍵索引,因為主鍵索引是聚集索引,每個葉子包含具體的一個行記錄(很多列的數據都在里面),而非聚集索引每個葉子只包含下一個主鍵索引的指針,很顯然葉子結點包含的數據是越少越好,查詢優化器就不會選擇主鍵索引。

當然,也可以強制使用主鍵索引,然后分析sql執行計劃。

圖片

我們看一下優化器默認使用唯一索引大致執行時間676ms:

圖片

強制使用主鍵索引大致執行時間779ms:

圖片

我們可以用force index強制指定索引,然后去分析執行計劃看看哪個索引是更好的,因為查詢優化器選擇索引不一定是百分百準確的,具體情況可以根據實際場景分析來確定是否使用查詢優化器選擇的索引。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2022-07-05 10:50:31

數據庫查詢實戰

2020-02-23 17:15:29

SQL分析查詢

2022-09-19 08:41:02

數據查詢分離

2019-06-20 11:20:25

sql優化數據庫

2023-09-27 08:21:00

查詢分離數據API

2024-05-28 08:47:52

2024-08-30 09:31:36

2025-02-14 09:30:42

2025-06-25 09:30:14

2011-06-28 08:32:40

MySQL慢查詢日志

2025-06-27 09:05:47

2022-06-30 19:40:36

查詢接口索引優化

2019-05-08 14:02:52

MySQL索引查詢優化數據庫

2022-08-14 14:32:06

接口優化

2021-04-07 10:38:43

MySQL數據庫命令

2010-06-12 15:31:04

MySQL查詢優化

2020-06-05 09:21:20

MySQL慢查詢數據庫

2017-05-23 16:26:26

MySQL優化處理

2020-09-01 11:10:39

數據庫鏈接池HikariCP

2024-10-09 23:32:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区电影视频在线观看 | 午夜视频免费在线观看 | 国产偷录视频叫床高潮对白 | 成年人网站免费视频 | 成人a免费 | 91在线电影 | 日本精品视频一区二区 | 国产精品综合色区在线观看 | 成人午夜免费视频 | 欧美网址在线观看 | 亚洲区一区二 | 99综合| 91久久国产综合久久 | 三级国产三级在线 | 少妇午夜一级艳片欧美精品 | 天天综合国产 | 九色国产| 毛片a区 | av网站在线播放 | 日本大香伊一区二区三区 | 91久久国产综合久久 | 日韩欧美在线不卡 | 免费av播放 | hitomi一区二区三区精品 | 欧美三级电影在线播放 | 影视先锋av资源噜噜 | 伊人色综合久久久天天蜜桃 | av日韩在线播放 | 日韩欧美国产一区二区 | 精品麻豆剧传媒av国产九九九 | 日韩成人免费视频 | 亚洲精品一区二区另类图片 | 成人免费福利视频 | 国产在线视频一区 | 久久新 | 69电影网 | 国产精品亚洲成在人线 | 九一视频在线观看 | 日本免费一区二区三区视频 | 91精品国产综合久久久久久首页 | 国产精品久久久久久福利一牛影视 |