mysql locate不走索引_MySQL 索引——定位并优化慢 SQL
定位并優化慢查詢SQL.png
為什么要學習定位并優化慢查詢 SQL
日常開發中,在數據量比較小的表中,SQL 的執行效率可能沒什么問題,但是隨著表數據量的增加,慢 SQL 可能就會慢慢浮現,因此學習如何定位并優化慢 SQL 非常有必要
慢 SQL 是什么
一條 SQL 從提交給 MySQL 到最終執行出結果的耗時超過了我們預先配置的一個時間閥值,那么這條 SQL 就是慢 SQL;簡單的說就是,我們預先會在 MySQL 上配置一個超時時間,如果 SQL 執行的時間超過這個值,那么這個 SQL 就是慢 SQL
如何定位慢 SQL
在定位慢 SQL 之前,我們需要先開啟我們的慢日志記錄
執行 show variables like "%query%";,結果如下圖,我們首先需要設置 slow_query_log為 ON,表示開啟慢日志記錄.
其中long_query_time代表慢查詢的時間限制,如果一條SQL執行的時間超過10s,則會被記錄到慢日志中。
其中慢日志記錄的地址是slow_query_log_file的值。
image.png
配置方式如下.
set global slow_query_log = on;
set long_query_time=1;
執行結果如下:
image.png
準備數據
我這里準備了含有100萬條數據的 test 表
表結果如下
image.png
執行一個相對耗時的SQL
select * from test order by c2 desc;
執行耗時1.413秒,已經超過了我們設置的慢 SQL 閥值 1 秒
image.png
查詢慢日志
查看````slow_query_log_file```變量對應的地址,查看該日志文件
sudo vim [slow_query_log_file變量對應的值]
慢日志
上圖的慢日志解析
從 22 行開始,是我們剛剛執行的那條 SQL 的慢日志
1. 23 行的 # Time: 2020-06-30T14:01:35.231434Z 代表了 SQL 執行完的時間點,從格式來看是 UTC時間
我們可以通過如下命令查詢show variables like "%log_timestamps%";查看默認的系統配置,可以發現確實是UTC時間
image.png
2. 24行的# User@Host: root[root] @ localhost [127.0.0.1] Id: 8.
其中
User@Host: root[root]代表了客戶端的賬戶信息,第一個為授權賬戶,第二個為登陸賬戶
localhost [127.0.0.1] 代表客戶端 IP 地址
Id: 8代表mysql的線程ID
3. 25行的# Query_time: 1.313886 Lock_time: 0.000104 Rows_sent: 1000000 Rows_examined: 2000000
其中Query_time代表查詢的耗時,Lock_time代表鎖持有時長,
Rows_sent代表返回客戶端的行數,Rows_examined代表優化器掃描的行數.我們可以通過減少優化器掃描的行數提升 SQL 性能。
如何優化慢 SQL
通過上面的步驟,我們已經可以定位到慢查詢 SQL 了,那如何優化呢?
利用 explain 分析慢 SQL
在分析查詢性能的時候,explain非常管用,這個關鍵字一般放在 select 語句前面,用于描述 MySQL 如何執行查詢操作,以及 MySQL 成功返回結果集需要執行的行數,Explain可以幫助我們分析 select語句,讓我們知道查詢效率低下的原因,從而改進我們的查詢,讓查詢優化器能更好的工作。
那我們就用 explain 分析一下我們剛才的慢 SQL .
explain select * from test order by c2 desc;
執行結果如下圖,
extra中出現以下2項意味著MySQL根本不能使用索引,效率會受到重大影響。應盡可能對其優化:
extra 項為Using filesort 時,表示MySQL會對結果使用一個外部索引排序,而不是從表里按索引次序讀到相關內容。 可能在內存或磁盤上進行排序。MySQL無法利用索引完成的排序操作稱為“文件排序”。【用不到任何索引進行排序】
extra項為Using temporary時,表示MySQL在對查詢結果排序時使用臨時表。常見于排序order by 和分組查詢group by。【將排序的一些結果存儲到一張臨時表中,方便后面做各種查詢使用】,關于 explain執行后的各個指標參數,后續單獨在一篇文章中解析
這里只簡單介紹一下:
id代表執行編號,select_type代表本行是簡單還是復雜查詢,table代表的是訪問的哪張表,type代表的是訪問類型,這里的all是最壞的一種情況,代表全表掃描,possible_keys表示哪一些索引有利于高效的查找,key代表mysql決定采用哪個索引來優化查詢,key_len代表顯示mysql在索引里使用的字節數,ref代表之前的表在key列記錄的索引中查找值所用的列或常量,rows代表為了找到所需的行而需要讀取的行數,估算值,不精確,filtered代表按表條件篩選的行的百分比,Extra代表額外信息
image.png
修改 SQL 或者盡量讓 SQL 走索引,進而提升它的效率
提升效率的小技巧
我們在使用查詢語句時可以在后面加上force index(索引名),來查看其執行時間,從而選擇具體的索引。
select count(c2) from test force index(PRIMARY);
select * from test force index(PRIMARY) order by c2 desc ;
總結
配置 MySQL 記錄慢日志的方式
1. 配置了 slow_query_log和long_query_time,當 SQL Query_time小于 long_query_time時,該 SQL 的執行就會進入慢日志
2. 當我們設置了系統變量log_queries_not_using_indexes為 ON ,這個系統變量開啟后,會將那些未使用索引的 SQL 也被記錄到慢查詢日志中,另外,full index scan 的 SQL 也會被記錄到慢查詢日志。所以,當滿足這些條件的 SQL ,即使 Query_time 時間小于 long_query_time 的值,也會被記錄到慢查詢日志
總結
以上是生活随笔為你收集整理的mysql locate不走索引_MySQL 索引——定位并优化慢 SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: amd服务器主板文件,AMD服务器主板全
- 下一篇: 3D动态烟花--HTML