日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql locate不走索引_MySQL 索引——定位并优化慢 SQL

發布時間:2024/3/12 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。