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

歡迎訪問 生活随笔!

生活随笔

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

数据库

11MYSQL:慢查询以及优化步骤

發布時間:2025/3/21 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11MYSQL:慢查询以及优化步骤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL記錄下查詢超過指定時間的語句,我們將超過指定時間的SQL語句查詢稱為慢查詢。

1、查看時間限制
show variables like '%long%';
如果查詢超過long_query_time的時間就稱為慢查詢


2、查看數據庫的啟動時間
show status like 'uptime%';

3、查看查詢語句條數
show status like 'com_Select';

4、獲取連接數
show status like 'connections';

5、設置慢查詢的時間
set long_query_time = 1;

6、以安全模式啟動mysql服務,慢查詢記錄將會寫入日志之中。
開啟慢查詢日志
在MySQL的配置文件中加以下參數
log-show-queries = D:/MySQL/Log/mysqld-slow-query.log
long-query-time = 5
log-queries-not-using-indexes

闡述:
有關慢查詢日志功能存放位置,該目錄文件一定要有寫的權限。

可以用設置,系統會給一個缺省的文件host_name-show.log
long_query_time
SQL執行時間閥值,默認為10秒
注意一下三點:
1、設置long_query_time這個閥值后,mysql數據庫會記錄運行時間超過該值的所有SQL語句,但對于運行時間正好等于long_query_time的情況并不會被記錄下來。也就是說,在mysql源碼里是判斷大于log_query_time,而非大于等于。
2、從MySQL5.1開始,long_query_time開始以微秒計算,這樣精確記錄SQL的運行時間。
3、建議該時間不應太小或太大,最好在5-10秒之間。當然可以根據自己的情況來定。
log-queries-not-using-indexes
如果運行的SQL語句沒有使用索引,則mysql數據庫同樣會將這條SQL語句記錄到慢查詢日志文件之中。


查詢優化神器 – explain命令

關于explain命令相信大家并不陌生,具體用法和字段含義可以參考官網explain-output,這里需要強調rows是核心指標,絕大部分rows小的語句執行一定很快(有例外,下面會講到)。所以優化語句基本上都是在優化rows。

慢查詢優化基本步驟

0.先運行看看是否真的很慢,注意設置SQL_NO_CACHE
1.where條件單表查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單表每個字段分別查詢,看哪個字段的區分度最高? ?查哪個字段時間比較長????
2.explain查看執行計劃,是否與1預期一致(從鎖定記錄較少的表開始查詢)
3.order by limit 形式的sql語句讓排序的表優先查
4.了解業務方使用場景
5.加索引時參照建索引的幾大原則
6.觀察結果,不符合預期繼續從0分析


建索引的幾大原則

1.最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2.=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前區分度就是0,那可能有人會問,這個比例有什么經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄

4.索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的字段值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那么只需要修改原來的索引即可

總結

以上是生活随笔為你收集整理的11MYSQL:慢查询以及优化步骤的全部內容,希望文章能夠幫你解決所遇到的問題。

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