MySQL使用慢查詢?nèi)罩維low Log定位低效SQL的全過程
在 MySQL 數(shù)據(jù)庫(kù)運(yùn)維中,SQL 語句的執(zhí)行效率直接影響系統(tǒng)響應(yīng)速度。當(dāng)網(wǎng)站出現(xiàn)卡頓、接口超時(shí)等問題時(shí),慢查詢?nèi)罩荆⊿low Log) 往往是定位低效 SQL 的 “第一手證據(jù)”。它能記錄所有執(zhí)行時(shí)間超過閾值的 SQL 語句,幫助我們精準(zhǔn)鎖定性能瓶頸 —— 無論是全表掃描、索引缺失,還是 JOIN 邏輯不合理,都能通過慢查詢?nèi)罩疽惶骄烤埂?/p>
一、慢查詢?nèi)罩净A(chǔ)配置
1. 查看當(dāng)前慢查詢狀態(tài)
首先通過 MySQL 命令行查看默認(rèn)配置,確認(rèn)慢查詢?nèi)罩臼欠駟⒂茫?/p>
-- 查看慢查詢?nèi)罩締⒂脿顟B(tài)(ON/OFF) show variables like 'slow_query_log'; -- 查看慢查詢閾值(單位:秒,默認(rèn)10秒) show variables like 'long_query_time'; -- 查看慢查詢?nèi)罩敬鎯?chǔ)路徑 show variables like 'slow_query_log_file';

2. 臨時(shí)啟用慢查詢?nèi)罩荆ㄖ貑⑹В?/h3>
適合臨時(shí)排查問題,無需重啟 MySQL 服務(wù):
-- 啟用慢查詢?nèi)罩? set global slow_query_log = 'ON'; -- 設(shè)置日志存儲(chǔ)路徑 set global slow_query_log_file = '/data/mysql/log/mysql-slow.log'; -- 設(shè)置閾值為 1 秒(執(zhí)行時(shí)間≥1秒的SQL會(huì)被記錄) set global long_query_time = 1; -- 記錄未使用索引的SQL(可選,謹(jǐn)慎啟用,可能產(chǎn)生大量日志) set global log_queries_not_using_indexes = 'ON';
3. 永久啟用慢查詢?nèi)罩荆ㄍ扑])
修改 MySQL 配置文件(my.cnf 或 my.ini),重啟后生效:
# 1. 編輯配置文件 vim /data/mysql/conf/my.cnf # 2. 添加配置 [mysqld] # 啟用慢查詢?nèi)罩? slow_query_log = 1 # 日志文件路徑(建議放在非系統(tǒng)盤,避免占用系統(tǒng)空間) slow_query_log_file = /data/mysql/log/mysql-slow.log # 慢查詢閾值(建議生產(chǎn)環(huán)境設(shè)為 1-3 秒) long_query_time = 1 # 記錄未使用索引的SQL(按需啟用) log_queries_not_using_indexes = 1 # 記錄管理語句(如 ALTER TABLE,可選) log_slow_admin_statements = 1 # 3. 重啟 MySQL 服務(wù) /etc/init.d/mysql.server restart
二、慢查詢?nèi)罩痉治龇椒?/h2>
1. 直接查看日志文件
慢查詢?nèi)罩緸槲谋靖袷?,可通過 cat、tail 等命令直接查看:
# 查看最新10條慢查詢 tail -n 10 /data/mysql/log/mysql-slow.log # 搜索包含特定表的慢查詢 grep 'user_info' /data/mysql/log/mysql-slow.log
日志格式解析(關(guān)鍵字段):
# Time: 2026-02-04T02:37:11.367549Z # 執(zhí)行時(shí)間 # User@Host: root[root] @ localhost [] Id: 11 # 執(zhí)行用戶與主機(jī) # Query_time: 2.011508 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 # 耗時(shí)、鎖時(shí)間、返回行數(shù)、檢查行數(shù) SET timestamp=1770172629; # 時(shí)間戳 select sleep(2); # 具體 SQL
Query_time:SQL 執(zhí)行時(shí)間(秒)
Lock_time:鎖等待時(shí)間(秒)
Rows_sent:返回結(jié)果行數(shù)
Rows_examined:掃描的行數(shù)(數(shù)值越大越可能存在優(yōu)化空間)
2. 使用 mysqldumpslow 工具分析
MySQL 自帶的日志分析工具,可統(tǒng)計(jì)慢查詢的頻率、平均執(zhí)行時(shí)間等:
# 統(tǒng)計(jì)執(zhí)行次數(shù)最多的前10條慢查詢 mysqldumpslow -s c -t 10 /data/mysql/log/mysql-slow.log # 統(tǒng)計(jì)平均執(zhí)行時(shí)間最長(zhǎng)的前10條慢查詢 mysqldumpslow -s t -t 10 /data/mysql/log/mysql-slow.log # 篩選包含 JOIN 的慢查詢 mysqldumpslow -g 'JOIN' /data/mysql/log/mysql-slow.log



參數(shù)說明:
-s:排序方式(c = 執(zhí)行次數(shù),t = 執(zhí)行時(shí)間,l = 鎖定時(shí)間,r = 返回行數(shù))-t:顯示條數(shù)-g:正則匹配篩選
3. 第三方工具推薦(進(jìn)階)
- pt-query-digest(Percona Toolkit):功能強(qiáng)大,支持按 SQL 模板分組、統(tǒng)計(jì)百分比,生成詳細(xì)分析報(bào)告
pt-query-digest /data/mysql/log/mysql-slow.log > slow_analysis.report
- MySQL Workbench:可視化工具,可通過 “Performance” 模塊導(dǎo)入慢查詢?nèi)罩?,生成圖表化分析結(jié)果
三、慢查詢優(yōu)化實(shí)操案例
案例 1:未使用索引導(dǎo)致全表掃描
慢查詢?nèi)罩局邪l(fā)現(xiàn):
Query_time: 4.5 Rows_examined: 50000 Rows_sent: 10 SELECT * FROM order_info WHERE create_time >= '2024-01-01';
優(yōu)化方案:為 create_time 字段添加索引
ALTER TABLE order_info ADD INDEX idx_create_time (create_time);
優(yōu)化后效果:Query_time 降至 0.01 秒,Rows_examined 變?yōu)?10。
案例 2:JOIN 語句缺少關(guān)聯(lián)索引
慢查詢?nèi)罩局邪l(fā)現(xiàn):
Query_time: 6.8 Rows_examined: 100000 SELECT u.name, o.order_no FROM user u JOIN order o ON u.id = o.user_id WHERE o.status = 1;
優(yōu)化方案:為關(guān)聯(lián)字段 o.user_id 添加索引
ALTER TABLE order ADD INDEX idx_user_id (user_id);
案例 3:SELECT * 導(dǎo)致無用字段掃描
慢查詢?nèi)罩局邪l(fā)現(xiàn):
Query_time: 3.1 Rows_examined: 8000 SELECT * FROM product WHERE category_id = 10;
優(yōu)化方案:只查詢需要的字段,避免全字段掃描
SELECT id, name, price FROM product WHERE category_id = 10;
四、慢查詢?nèi)罩臼褂米⒁馐马?xiàng)
控制日志大小:
- 避免將
long_query_time設(shè)置過?。ㄈ?),否則會(huì)產(chǎn)生大量日志,占用磁盤空間并影響性能 - 定期輪轉(zhuǎn)日志(可通過
logrotate工具或 MySQL 自帶的FLUSH LOGS命令)
生產(chǎn)環(huán)境謹(jǐn)慎啟用 “未使用索引日志”:
log_queries_not_using_indexes = 1會(huì)記錄所有未使用索引的 SQL,即使執(zhí)行時(shí)間很短,可能導(dǎo)致日志膨脹- 建議僅在排查特定問題時(shí)臨時(shí)啟用
結(jié)合 EXPLAIN 分析 SQL:
對(duì)于慢查詢?nèi)罩局械?SQL,使用 EXPLAIN 查看執(zhí)行計(jì)劃,明確優(yōu)化方向:
EXPLAIN SELECT * FROM user_info WHERE age > 30;
重點(diǎn)關(guān)注 type(訪問類型,如 ALL = 全表掃描、ref = 索引查找)、key(使用的索引)、rows(預(yù)計(jì)掃描行數(shù))字段。
總結(jié)
慢查詢?nèi)罩臼?MySQL 性能優(yōu)化的 “利器”,通過合理配置和高效分析,能快速定位低效 SQL 并進(jìn)行優(yōu)化。核心步驟可概括為:
- 啟用慢查詢?nèi)罩荆O(shè)置合理閾值
- 利用工具分析日志,鎖定高頻 / 耗時(shí) SQL
- 通過添加索引、優(yōu)化 SQL 語句等方式解決瓶頸
- 持續(xù)監(jiān)控日志,預(yù)防性能問題復(fù)發(fā)
掌握慢查詢?nèi)罩镜氖褂?,能讓?shù)據(jù)庫(kù)運(yùn)維從 “被動(dòng)排查” 轉(zhuǎn)向 “主動(dòng)優(yōu)化”,為系統(tǒng)穩(wěn)定性保駕護(hù)航。
以上就是MySQL使用慢查詢?nèi)罩維low Log定位低效SQL的全過程的詳細(xì)內(nèi)容,更多關(guān)于MySQL慢查詢?nèi)罩径ㄎ坏托QL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql出現(xiàn)提示錯(cuò)誤10061的解決方法
這篇文章主要為大家詳細(xì)介紹了mysql出現(xiàn)提示錯(cuò)誤10061的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
dbeaver如何導(dǎo)出mysql數(shù)據(jù)庫(kù)
DBeaver導(dǎo)出MySQL數(shù)據(jù)庫(kù)的簡(jiǎn)便方法:右鍵點(diǎn)擊表選擇“Tools”->“Dump database”,設(shè)定輸出文件夾(例如桌面),點(diǎn)擊開始即可導(dǎo)出SQL文件,此方法基于個(gè)人經(jīng)驗(yàn),供參考2024-10-10
mysql中使用UDF自動(dòng)同步memcached效率筆記
接上篇:mysql使用mysql-udf-http效率測(cè)試筆記 ,這次不使用rest架構(gòu),而是使用:libmemcached和memcached_functions_mysql2011-08-08
mysql 添加索引 mysql 如何創(chuàng)建索引
本文將介紹mysql 如何創(chuàng)建索引,需要的朋友可以參考下2012-11-11

