從配置到性能優(yōu)化全面解析MySQL慢查詢?nèi)罩?/h1>
更新時(shí)間:2026年02月06日 09:24:06 作者:Reboot
這篇文章將和大家深入探討MySQL慢查詢?nèi)罩镜呐渲?、分析和?yōu)化實(shí)踐,幫助數(shù)據(jù)庫(kù)開發(fā)和管理人員有效識(shí)別和解決數(shù)據(jù)庫(kù)性能問題,有需要的小伙伴可以了解下
1. 慢查詢?nèi)罩靖攀?/h2>
1.1 什么是慢查詢?nèi)罩?/h3>
MySQL慢查詢?nèi)罩臼荕ySQL數(shù)據(jù)庫(kù)提供的一種性能診斷工具,用于記錄執(zhí)行時(shí)間超過指定閾值的SQL查詢語(yǔ)句。通過分析慢查詢?nèi)罩?,開發(fā)人員和DBA可以:
- 識(shí)別執(zhí)行效率低下的SQL語(yǔ)句
- 發(fā)現(xiàn)數(shù)據(jù)庫(kù)設(shè)計(jì)或索引設(shè)計(jì)的問題
- 監(jiān)控?cái)?shù)據(jù)庫(kù)性能變化趨勢(shì)
- 為SQL優(yōu)化提供數(shù)據(jù)依據(jù)
1.2 慢查詢?nèi)罩镜闹匾?/h3>
在數(shù)據(jù)庫(kù)性能優(yōu)化中,慢查詢?nèi)罩臼遣豢苫蛉钡墓ぞ摺?jù)統(tǒng)計(jì),80%的數(shù)據(jù)庫(kù)性能問題都是由少數(shù)幾個(gè)執(zhí)行效率低下的SQL語(yǔ)句引起的。通過慢查詢?nèi)罩?,我們可以精?zhǔn)定位這些問題SQL,實(shí)現(xiàn)"精準(zhǔn)打擊"。
2. 慢查詢?nèi)罩镜呐渲门c管理
2.1 檢查當(dāng)前狀態(tài)
在配置慢查詢?nèi)罩局埃紫刃枰獧z查當(dāng)前的相關(guān)配置狀態(tài):
-- 檢查慢查詢?nèi)罩臼欠耖_啟
SHOW VARIABLES LIKE 'slow_query_log';
-- 查看慢查詢?nèi)罩疚募窂?
SHOW VARIABLES LIKE 'slow_query_log_file';
-- 查看慢查詢時(shí)間閾值
SHOW VARIABLES LIKE 'long_query_time';
-- 檢查是否記錄未使用索引的查詢
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
-- 查看累計(jì)慢查詢數(shù)量
SHOW GLOBAL STATUS LIKE 'Slow_queries';
2.2 開啟慢查詢?nèi)罩?/h3>
臨時(shí)開啟(重啟后失效)
-- 開啟慢查詢?nèi)罩?
SET GLOBAL slow_query_log = 'ON';
-- 設(shè)置慢查詢時(shí)間閾值為2秒
SET GLOBAL long_query_time = 2;
-- 指定日志文件路徑
SET GLOBAL slow_query_log_file = '/var/lib/mysql/mysql-slow.log';
-- 可選:記錄未使用索引的查詢(生產(chǎn)環(huán)境慎用)
SET GLOBAL log_queries_not_using_indexes = 'ON';
永久開啟(修改配置文件)
修改MySQL配置文件(my.cnf或my.ini),在[mysqld]部分添加以下配置:
[mysqld]
# 開啟慢查詢?nèi)罩?
slow_query_log = 1
# 慢查詢?nèi)罩疚募窂?
slow_query_log_file = /var/lib/mysql/mysql-slow.log
# 慢查詢時(shí)間閾值,單位:秒
long_query_time = 2
# 記錄未使用索引的查詢(可選,生產(chǎn)環(huán)境慎用)
log_queries_not_using_indexes = 0
# 慢查詢?nèi)罩居涗洉r(shí)區(qū)(MySQL 8.0+)
log_timestamps = SYSTEM
修改完成后需要重啟MySQL服務(wù)使配置生效。
2.3 配置參數(shù)詳解
參數(shù)名 默認(rèn)值 說明 建議 slow_query_log OFF 慢查詢?nèi)罩鹃_關(guān) 生產(chǎn)環(huán)境建議開啟 long_query_time 10.0 慢查詢閾值(秒) 生產(chǎn)環(huán)境2-5秒,開發(fā)環(huán)境0.5-1秒 slow_query_log_file host_name-slow.log 日志文件路徑 建議指定絕對(duì)路徑 log_queries_not_using_indexes OFF 是否記錄未使用索引的查詢 性能測(cè)試時(shí)開啟,生產(chǎn)環(huán)境關(guān)閉 min_examined_row_limit 0 記錄檢查行數(shù)下限 可根據(jù)業(yè)務(wù)特點(diǎn)調(diào)整 log_slow_admin_statements OFF 是否記錄管理語(yǔ)句 按需開啟 log_output FILE 日志輸出方式 建議使用FILE
3. 慢查詢?nèi)罩緝?nèi)容解析
3.1 日志格式詳解
一條完整的慢查詢?nèi)罩居涗浲ǔ0韵虏糠郑?/p>
# Time: 2023-10-25T08:15:30.123456Z
# User@Host: user1[app_user] @ [192.168.1.100] Id: 123456
# Query_time: 5.123456 Lock_time: 0.001234 Rows_sent: 150 Rows_examined: 500000
SET timestamp=1698221730;
SELECT * FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.create_date > '2023-01-01'
AND o.status = 'pending'
AND c.country = 'US'
ORDER BY o.create_date DESC;
3.2 關(guān)鍵字段說明
字段 含義 性能分析意義 Time 查詢發(fā)生的時(shí)間戳 用于分析慢查詢的時(shí)間分布 User@Host 執(zhí)行查詢的用戶和主機(jī) 定位問題用戶或應(yīng)用 Query_time 查詢總執(zhí)行時(shí)間 核心性能指標(biāo),直接反映SQL性能 Lock_time 表鎖等待時(shí)間 鎖競(jìng)爭(zhēng)嚴(yán)重時(shí)需要關(guān)注 Rows_sent 返回客戶端的行數(shù) 查詢結(jié)果集大小 Rows_examined 服務(wù)器掃描的行數(shù) 關(guān)鍵指標(biāo),反映索引效率 SQL語(yǔ)句 完整的SQL文本 優(yōu)化分析的對(duì)象
3.3 執(zhí)行時(shí)間分析
Query_time字段是慢查詢?nèi)罩局凶钪匾闹笜?biāo),它精確記錄了SQL在數(shù)據(jù)庫(kù)服務(wù)器上的實(shí)際執(zhí)行時(shí)間。這個(gè)時(shí)間包括:
- SQL解析和優(yōu)化時(shí)間
- 數(shù)據(jù)讀取時(shí)間(磁盤I/O)
- 數(shù)據(jù)處理時(shí)間(CPU)
- 鎖等待時(shí)間
- 網(wǎng)絡(luò)傳輸時(shí)間(在數(shù)據(jù)庫(kù)服務(wù)器內(nèi))
4. 慢查詢?nèi)罩痉治龉ぞ?/h2>
4.1 使用mysqldumpslow分析
mysqldumpslow是MySQL官方提供的慢查詢?nèi)罩痉治龉ぞ撸?/p>
# 按執(zhí)行時(shí)間排序,顯示最慢的10個(gè)查詢
mysqldumpslow -s t -t 10 /path/to/slow.log
# 按出現(xiàn)次數(shù)排序,顯示最常見的10個(gè)慢查詢
mysqldumpslow -s c -t 10 /path/to/slow.log
# 按累計(jì)執(zhí)行時(shí)間排序
mysqldumpslow -s at -t 10 /path/to/slow.log
# 分析特定用戶的慢查詢
mysqldumpslow -a -g "user1" /path/to/slow.log
# 詳細(xì)模式,顯示完整的SQL語(yǔ)句
mysqldumpslow -a -s t -t 5 /path/to/slow.log
4.2 使用pt-query-digest分析
Percona Toolkit中的pt-query-digest是更強(qiáng)大的分析工具:
# 基本用法
pt-query-digest /path/to/slow.log
# 輸出到文件
pt-query-digest /path/to/slow.log > slow_report.txt
# 分析最近12小時(shí)的慢查詢
pt-query-digest --since=12h /path/to/slow.log
# 按特定維度分析
pt-query-digest --group-by=fingerprint --order-by=query_time:sum /path/to/slow.log
# 對(duì)比兩個(gè)時(shí)間段的慢查詢
pt-query-digest --since=2023-10-01 --until=2023-10-02 /path/to/slow.log
4.3 自定義SQL分析
對(duì)于輸出到表的慢查詢?nèi)罩?,可以直接使用SQL進(jìn)行分析:
-- 查詢最慢的10個(gè)SQL語(yǔ)句
SELECT db, query_time, lock_time, rows_sent, rows_examined, sql_text
FROM mysql.slow_log
ORDER BY query_time DESC
LIMIT 10;
-- 分析各數(shù)據(jù)庫(kù)的慢查詢分布
SELECT db, COUNT(*) as slow_count, AVG(query_time) as avg_time
FROM mysql.slow_log
WHERE start_time > NOW() - INTERVAL 1 DAY
GROUP BY db;
-- 查找掃描行數(shù)過多的查詢
SELECT sql_text, rows_examined, rows_sent,
ROUND(rows_examined/rows_sent) as ratio
FROM mysql.slow_log
WHERE rows_sent > 0 AND rows_examined > 10000
ORDER BY ratio DESC
LIMIT 10;
5. 基于慢查詢?nèi)罩镜男阅軆?yōu)化實(shí)踐
5.1 優(yōu)化流程
- 識(shí)別問題SQL:從慢查詢?nèi)罩局姓页鰣?zhí)行時(shí)間最長(zhǎng)、頻率最高的查詢
- 分析執(zhí)行計(jì)劃:使用EXPLAIN分析SQL執(zhí)行計(jì)劃
- 定位瓶頸:確定是索引問題、JOIN問題還是數(shù)據(jù)量問題
- 實(shí)施優(yōu)化:添加索引、重寫SQL、調(diào)整schema等
- 驗(yàn)證效果:對(duì)比優(yōu)化前后的執(zhí)行時(shí)間和資源消耗
5.2 常見問題及解決方案
案例1:缺少合適的索引
-- 慢查詢?nèi)罩局械脑糞QL
# Query_time: 4.234567 Lock_time: 0.001000 Rows_sent: 1 Rows_examined: 500000
SELECT * FROM orders WHERE customer_id = 100 AND status = 'completed';
-- 優(yōu)化方案:添加復(fù)合索引
ALTER TABLE orders ADD INDEX idx_customer_status (customer_id, status);
案例2:低效的LIKE查詢
-- 慢查詢?nèi)罩局械脑糞QL
# Query_time: 3.123456 Lock_time: 0.002000 Rows_sent: 50 Rows_examined: 1000000
SELECT * FROM products WHERE name LIKE '%apple%';
-- 優(yōu)化方案:使用全文索引或調(diào)整查詢方式
ALTER TABLE products ADD FULLTEXT(name);
SELECT * FROM products WHERE MATCH(name) AGAINST('apple' IN NATURAL LANGUAGE MODE);
案例3:大表分頁(yè)查詢
-- 慢查詢?nèi)罩局械脑糞QL
# Query_time: 2.987654 Lock_time: 0.003000 Rows_sent: 20 Rows_examined: 100020
SELECT * FROM orders ORDER BY create_date DESC LIMIT 100000, 20;
-- 優(yōu)化方案:使用游標(biāo)分頁(yè)或子查詢優(yōu)化
SELECT * FROM orders
WHERE id > (SELECT id FROM orders ORDER BY create_date DESC LIMIT 100000, 1)
ORDER BY create_date DESC LIMIT 20;
5.3 索引優(yōu)化策略
基于慢查詢?nèi)罩镜某R娝饕齼?yōu)化:
- 為WHERE條件列添加索引
- 為JOIN條件列添加索引
- 為ORDER BY和GROUP BY列添加索引
- 使用覆蓋索引減少回表
- 注意索引選擇性和區(qū)分度
6. 生產(chǎn)環(huán)境最佳實(shí)踐
6.1 配置建議
- 閾值設(shè)置:生產(chǎn)環(huán)境建議2-5秒,開發(fā)測(cè)試環(huán)境可設(shè)置為0.5-1秒
- 日志輪轉(zhuǎn):配置日志輪轉(zhuǎn),避免日志文件過大
- 監(jiān)控告警:對(duì)慢查詢數(shù)量設(shè)置監(jiān)控告警
- 定期分析:每周或每月定期分析慢查詢趨勢(shì)
6.2 性能考量
開啟慢查詢?nèi)罩緦?duì)數(shù)據(jù)庫(kù)性能有一定影響,主要體現(xiàn)在:
- I/O開銷:日志寫入會(huì)增加磁盤I/O
- CPU開銷:日志記錄和分析需要CPU資源
- 存儲(chǔ)空間:日志文件占用磁盤空間
建議在高并發(fā)業(yè)務(wù)高峰期適當(dāng)調(diào)整閾值,或使用采樣方式記錄。
6.3 與其他工具結(jié)合
慢查詢?nèi)罩緫?yīng)與其他監(jiān)控工具結(jié)合使用:
- Performance Schema:深入分析SQL執(zhí)行細(xì)節(jié)
- EXPLAIN ANALYZE:分析SQL執(zhí)行計(jì)劃
- MySQL Enterprise Monitor:企業(yè)級(jí)監(jiān)控方案
- Prometheus + Grafana:可視化監(jiān)控
7. 總結(jié)
MySQL慢查詢?nèi)罩臼菙?shù)據(jù)庫(kù)性能優(yōu)化中不可或缺的工具,它提供了SQL執(zhí)行時(shí)間的精確記錄。通過合理配置慢查詢?nèi)罩?,結(jié)合專業(yè)的分析工具,我們可以:
- 精準(zhǔn)定位性能瓶頸
- 識(shí)別優(yōu)化機(jī)會(huì)
- 監(jiān)控?cái)?shù)據(jù)庫(kù)性能趨勢(shì)
- 預(yù)防潛在的性能問題
記住,慢查詢?nèi)罩局皇瞧瘘c(diǎn),真正的價(jià)值在于基于日志分析結(jié)果采取有效的優(yōu)化措施,持續(xù)提升數(shù)據(jù)庫(kù)性能。建議將慢查詢?nèi)罩痉治黾{入日常的數(shù)據(jù)庫(kù)維護(hù)流程,建立從監(jiān)控、分析到優(yōu)化的完整閉環(huán)。
以上就是從配置到性能優(yōu)化全面解析MySQL慢查詢?nèi)罩镜脑敿?xì)內(nèi)容,更多關(guān)于MySQL慢查詢?nèi)罩镜馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
-
MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)
這篇文章主要給大家介紹了關(guān)于MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL8.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧 2020-06-06
-
MySQL數(shù)據(jù)庫(kù)內(nèi)置函數(shù)使用說明
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)內(nèi)置函數(shù)使用說明的相關(guān)資料,MySQL提供了多種內(nèi)置函數(shù)來實(shí)現(xiàn)不同的功能,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下 2023-12-12
-
簡(jiǎn)單分析MySQL中的primary key功能
這篇文章主要介紹了MySQL中的primary key功能,包括講到了其對(duì)InnoDB使用的影響,需要的朋友可以參考下 2015-05-05
-
本地下載MySQL 8.0.37并上傳服務(wù)器Centos7.9安裝的完整指南
在生產(chǎn)環(huán)境中,我們常常會(huì)遇到服務(wù)器無(wú)法連接外網(wǎng)的情況,這時(shí)候就需要離線安裝MySQL,本文詳細(xì)介紹如何從官網(wǎng)下載MySQL 8.0.37,上傳到CentOS 7.9服務(wù)器并進(jìn)行完整安裝配置,希望對(duì)大家有所幫助 2025-11-11
-
MySQL 有輸入輸出參數(shù)的存儲(chǔ)過程實(shí)例
MySQL 有輸入輸出參數(shù)的存儲(chǔ)過程實(shí)例 2009-08-08
-
MySQL字段默認(rèn)值為NULL時(shí)的避坑指南
在 MySQL 中,字段默認(rèn)值為 NULL 是一種常見設(shè)計(jì),但如果你不小心,NULL 會(huì)成為你系統(tǒng)中最隱蔽的問題源頭之一,本文將通過真實(shí) SQL 示例,帶你了解默認(rèn)值為 NULL 時(shí)常見的“坑”,需要的朋友可以參考下 2025-05-05
-
MySQL?Community?Server?8.0.29安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了MySQL?Community?Server?8.0.29安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2022-06-06
最新評(píng)論
1. 慢查詢?nèi)罩靖攀?/h2>
1.1 什么是慢查詢?nèi)罩?/h3>
MySQL慢查詢?nèi)罩臼荕ySQL數(shù)據(jù)庫(kù)提供的一種性能診斷工具,用于記錄執(zhí)行時(shí)間超過指定閾值的SQL查詢語(yǔ)句。通過分析慢查詢?nèi)罩?,開發(fā)人員和DBA可以:
- 識(shí)別執(zhí)行效率低下的SQL語(yǔ)句
- 發(fā)現(xiàn)數(shù)據(jù)庫(kù)設(shè)計(jì)或索引設(shè)計(jì)的問題
- 監(jiān)控?cái)?shù)據(jù)庫(kù)性能變化趨勢(shì)
- 為SQL優(yōu)化提供數(shù)據(jù)依據(jù)
1.2 慢查詢?nèi)罩镜闹匾?/h3>
在數(shù)據(jù)庫(kù)性能優(yōu)化中,慢查詢?nèi)罩臼遣豢苫蛉钡墓ぞ摺?jù)統(tǒng)計(jì),80%的數(shù)據(jù)庫(kù)性能問題都是由少數(shù)幾個(gè)執(zhí)行效率低下的SQL語(yǔ)句引起的。通過慢查詢?nèi)罩?,我們可以精?zhǔn)定位這些問題SQL,實(shí)現(xiàn)"精準(zhǔn)打擊"。
2. 慢查詢?nèi)罩镜呐渲门c管理
2.1 檢查當(dāng)前狀態(tài)
在配置慢查詢?nèi)罩局埃紫刃枰獧z查當(dāng)前的相關(guān)配置狀態(tài):
-- 檢查慢查詢?nèi)罩臼欠耖_啟 SHOW VARIABLES LIKE 'slow_query_log'; -- 查看慢查詢?nèi)罩疚募窂? SHOW VARIABLES LIKE 'slow_query_log_file'; -- 查看慢查詢時(shí)間閾值 SHOW VARIABLES LIKE 'long_query_time'; -- 檢查是否記錄未使用索引的查詢 SHOW VARIABLES LIKE 'log_queries_not_using_indexes'; -- 查看累計(jì)慢查詢數(shù)量 SHOW GLOBAL STATUS LIKE 'Slow_queries';
2.2 開啟慢查詢?nèi)罩?/h3>
臨時(shí)開啟(重啟后失效)
-- 開啟慢查詢?nèi)罩? SET GLOBAL slow_query_log = 'ON'; -- 設(shè)置慢查詢時(shí)間閾值為2秒 SET GLOBAL long_query_time = 2; -- 指定日志文件路徑 SET GLOBAL slow_query_log_file = '/var/lib/mysql/mysql-slow.log'; -- 可選:記錄未使用索引的查詢(生產(chǎn)環(huán)境慎用) SET GLOBAL log_queries_not_using_indexes = 'ON';
永久開啟(修改配置文件)
修改MySQL配置文件(my.cnf或my.ini),在[mysqld]部分添加以下配置:
[mysqld] # 開啟慢查詢?nèi)罩? slow_query_log = 1 # 慢查詢?nèi)罩疚募窂? slow_query_log_file = /var/lib/mysql/mysql-slow.log # 慢查詢時(shí)間閾值,單位:秒 long_query_time = 2 # 記錄未使用索引的查詢(可選,生產(chǎn)環(huán)境慎用) log_queries_not_using_indexes = 0 # 慢查詢?nèi)罩居涗洉r(shí)區(qū)(MySQL 8.0+) log_timestamps = SYSTEM
修改完成后需要重啟MySQL服務(wù)使配置生效。
2.3 配置參數(shù)詳解
| 參數(shù)名 | 默認(rèn)值 | 說明 | 建議 |
|---|---|---|---|
| slow_query_log | OFF | 慢查詢?nèi)罩鹃_關(guān) | 生產(chǎn)環(huán)境建議開啟 |
| long_query_time | 10.0 | 慢查詢閾值(秒) | 生產(chǎn)環(huán)境2-5秒,開發(fā)環(huán)境0.5-1秒 |
| slow_query_log_file | host_name-slow.log | 日志文件路徑 | 建議指定絕對(duì)路徑 |
| log_queries_not_using_indexes | OFF | 是否記錄未使用索引的查詢 | 性能測(cè)試時(shí)開啟,生產(chǎn)環(huán)境關(guān)閉 |
| min_examined_row_limit | 0 | 記錄檢查行數(shù)下限 | 可根據(jù)業(yè)務(wù)特點(diǎn)調(diào)整 |
| log_slow_admin_statements | OFF | 是否記錄管理語(yǔ)句 | 按需開啟 |
| log_output | FILE | 日志輸出方式 | 建議使用FILE |
3. 慢查詢?nèi)罩緝?nèi)容解析
3.1 日志格式詳解
一條完整的慢查詢?nèi)罩居涗浲ǔ0韵虏糠郑?/p>
# Time: 2023-10-25T08:15:30.123456Z
# User@Host: user1[app_user] @ [192.168.1.100] Id: 123456
# Query_time: 5.123456 Lock_time: 0.001234 Rows_sent: 150 Rows_examined: 500000
SET timestamp=1698221730;
SELECT * FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.create_date > '2023-01-01'
AND o.status = 'pending'
AND c.country = 'US'
ORDER BY o.create_date DESC;
3.2 關(guān)鍵字段說明
| 字段 | 含義 | 性能分析意義 |
|---|---|---|
| Time | 查詢發(fā)生的時(shí)間戳 | 用于分析慢查詢的時(shí)間分布 |
| User@Host | 執(zhí)行查詢的用戶和主機(jī) | 定位問題用戶或應(yīng)用 |
| Query_time | 查詢總執(zhí)行時(shí)間 | 核心性能指標(biāo),直接反映SQL性能 |
| Lock_time | 表鎖等待時(shí)間 | 鎖競(jìng)爭(zhēng)嚴(yán)重時(shí)需要關(guān)注 |
| Rows_sent | 返回客戶端的行數(shù) | 查詢結(jié)果集大小 |
| Rows_examined | 服務(wù)器掃描的行數(shù) | 關(guān)鍵指標(biāo),反映索引效率 |
| SQL語(yǔ)句 | 完整的SQL文本 | 優(yōu)化分析的對(duì)象 |
3.3 執(zhí)行時(shí)間分析
Query_time字段是慢查詢?nèi)罩局凶钪匾闹笜?biāo),它精確記錄了SQL在數(shù)據(jù)庫(kù)服務(wù)器上的實(shí)際執(zhí)行時(shí)間。這個(gè)時(shí)間包括:
- SQL解析和優(yōu)化時(shí)間
- 數(shù)據(jù)讀取時(shí)間(磁盤I/O)
- 數(shù)據(jù)處理時(shí)間(CPU)
- 鎖等待時(shí)間
- 網(wǎng)絡(luò)傳輸時(shí)間(在數(shù)據(jù)庫(kù)服務(wù)器內(nèi))
4. 慢查詢?nèi)罩痉治龉ぞ?/h2>
4.1 使用mysqldumpslow分析
mysqldumpslow是MySQL官方提供的慢查詢?nèi)罩痉治龉ぞ撸?/p>
# 按執(zhí)行時(shí)間排序,顯示最慢的10個(gè)查詢 mysqldumpslow -s t -t 10 /path/to/slow.log # 按出現(xiàn)次數(shù)排序,顯示最常見的10個(gè)慢查詢 mysqldumpslow -s c -t 10 /path/to/slow.log # 按累計(jì)執(zhí)行時(shí)間排序 mysqldumpslow -s at -t 10 /path/to/slow.log # 分析特定用戶的慢查詢 mysqldumpslow -a -g "user1" /path/to/slow.log # 詳細(xì)模式,顯示完整的SQL語(yǔ)句 mysqldumpslow -a -s t -t 5 /path/to/slow.log
4.2 使用pt-query-digest分析
Percona Toolkit中的pt-query-digest是更強(qiáng)大的分析工具:
# 基本用法 pt-query-digest /path/to/slow.log # 輸出到文件 pt-query-digest /path/to/slow.log > slow_report.txt # 分析最近12小時(shí)的慢查詢 pt-query-digest --since=12h /path/to/slow.log # 按特定維度分析 pt-query-digest --group-by=fingerprint --order-by=query_time:sum /path/to/slow.log # 對(duì)比兩個(gè)時(shí)間段的慢查詢 pt-query-digest --since=2023-10-01 --until=2023-10-02 /path/to/slow.log
4.3 自定義SQL分析
對(duì)于輸出到表的慢查詢?nèi)罩?,可以直接使用SQL進(jìn)行分析:
-- 查詢最慢的10個(gè)SQL語(yǔ)句
SELECT db, query_time, lock_time, rows_sent, rows_examined, sql_text
FROM mysql.slow_log
ORDER BY query_time DESC
LIMIT 10;
-- 分析各數(shù)據(jù)庫(kù)的慢查詢分布
SELECT db, COUNT(*) as slow_count, AVG(query_time) as avg_time
FROM mysql.slow_log
WHERE start_time > NOW() - INTERVAL 1 DAY
GROUP BY db;
-- 查找掃描行數(shù)過多的查詢
SELECT sql_text, rows_examined, rows_sent,
ROUND(rows_examined/rows_sent) as ratio
FROM mysql.slow_log
WHERE rows_sent > 0 AND rows_examined > 10000
ORDER BY ratio DESC
LIMIT 10;
5. 基于慢查詢?nèi)罩镜男阅軆?yōu)化實(shí)踐
5.1 優(yōu)化流程
- 識(shí)別問題SQL:從慢查詢?nèi)罩局姓页鰣?zhí)行時(shí)間最長(zhǎng)、頻率最高的查詢
- 分析執(zhí)行計(jì)劃:使用EXPLAIN分析SQL執(zhí)行計(jì)劃
- 定位瓶頸:確定是索引問題、JOIN問題還是數(shù)據(jù)量問題
- 實(shí)施優(yōu)化:添加索引、重寫SQL、調(diào)整schema等
- 驗(yàn)證效果:對(duì)比優(yōu)化前后的執(zhí)行時(shí)間和資源消耗
5.2 常見問題及解決方案
案例1:缺少合適的索引
-- 慢查詢?nèi)罩局械脑糞QL # Query_time: 4.234567 Lock_time: 0.001000 Rows_sent: 1 Rows_examined: 500000 SELECT * FROM orders WHERE customer_id = 100 AND status = 'completed'; -- 優(yōu)化方案:添加復(fù)合索引 ALTER TABLE orders ADD INDEX idx_customer_status (customer_id, status);
案例2:低效的LIKE查詢
-- 慢查詢?nèi)罩局械脑糞QL
# Query_time: 3.123456 Lock_time: 0.002000 Rows_sent: 50 Rows_examined: 1000000
SELECT * FROM products WHERE name LIKE '%apple%';
-- 優(yōu)化方案:使用全文索引或調(diào)整查詢方式
ALTER TABLE products ADD FULLTEXT(name);
SELECT * FROM products WHERE MATCH(name) AGAINST('apple' IN NATURAL LANGUAGE MODE);
案例3:大表分頁(yè)查詢
-- 慢查詢?nèi)罩局械脑糞QL # Query_time: 2.987654 Lock_time: 0.003000 Rows_sent: 20 Rows_examined: 100020 SELECT * FROM orders ORDER BY create_date DESC LIMIT 100000, 20; -- 優(yōu)化方案:使用游標(biāo)分頁(yè)或子查詢優(yōu)化 SELECT * FROM orders WHERE id > (SELECT id FROM orders ORDER BY create_date DESC LIMIT 100000, 1) ORDER BY create_date DESC LIMIT 20;
5.3 索引優(yōu)化策略
基于慢查詢?nèi)罩镜某R娝饕齼?yōu)化:
- 為WHERE條件列添加索引
- 為JOIN條件列添加索引
- 為ORDER BY和GROUP BY列添加索引
- 使用覆蓋索引減少回表
- 注意索引選擇性和區(qū)分度
6. 生產(chǎn)環(huán)境最佳實(shí)踐
6.1 配置建議
- 閾值設(shè)置:生產(chǎn)環(huán)境建議2-5秒,開發(fā)測(cè)試環(huán)境可設(shè)置為0.5-1秒
- 日志輪轉(zhuǎn):配置日志輪轉(zhuǎn),避免日志文件過大
- 監(jiān)控告警:對(duì)慢查詢數(shù)量設(shè)置監(jiān)控告警
- 定期分析:每周或每月定期分析慢查詢趨勢(shì)
6.2 性能考量
開啟慢查詢?nèi)罩緦?duì)數(shù)據(jù)庫(kù)性能有一定影響,主要體現(xiàn)在:
- I/O開銷:日志寫入會(huì)增加磁盤I/O
- CPU開銷:日志記錄和分析需要CPU資源
- 存儲(chǔ)空間:日志文件占用磁盤空間
建議在高并發(fā)業(yè)務(wù)高峰期適當(dāng)調(diào)整閾值,或使用采樣方式記錄。
6.3 與其他工具結(jié)合
慢查詢?nèi)罩緫?yīng)與其他監(jiān)控工具結(jié)合使用:
- Performance Schema:深入分析SQL執(zhí)行細(xì)節(jié)
- EXPLAIN ANALYZE:分析SQL執(zhí)行計(jì)劃
- MySQL Enterprise Monitor:企業(yè)級(jí)監(jiān)控方案
- Prometheus + Grafana:可視化監(jiān)控
7. 總結(jié)
MySQL慢查詢?nèi)罩臼菙?shù)據(jù)庫(kù)性能優(yōu)化中不可或缺的工具,它提供了SQL執(zhí)行時(shí)間的精確記錄。通過合理配置慢查詢?nèi)罩?,結(jié)合專業(yè)的分析工具,我們可以:
- 精準(zhǔn)定位性能瓶頸
- 識(shí)別優(yōu)化機(jī)會(huì)
- 監(jiān)控?cái)?shù)據(jù)庫(kù)性能趨勢(shì)
- 預(yù)防潛在的性能問題
記住,慢查詢?nèi)罩局皇瞧瘘c(diǎn),真正的價(jià)值在于基于日志分析結(jié)果采取有效的優(yōu)化措施,持續(xù)提升數(shù)據(jù)庫(kù)性能。建議將慢查詢?nèi)罩痉治黾{入日常的數(shù)據(jù)庫(kù)維護(hù)流程,建立從監(jiān)控、分析到優(yōu)化的完整閉環(huán)。
以上就是從配置到性能優(yōu)化全面解析MySQL慢查詢?nèi)罩镜脑敿?xì)內(nèi)容,更多關(guān)于MySQL慢查詢?nèi)罩镜馁Y料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)
這篇文章主要給大家介紹了關(guān)于MySQL8.0窗口函數(shù)入門實(shí)踐及總結(jié)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用MySQL8.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
MySQL數(shù)據(jù)庫(kù)內(nèi)置函數(shù)使用說明
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)內(nèi)置函數(shù)使用說明的相關(guān)資料,MySQL提供了多種內(nèi)置函數(shù)來實(shí)現(xiàn)不同的功能,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
簡(jiǎn)單分析MySQL中的primary key功能
這篇文章主要介紹了MySQL中的primary key功能,包括講到了其對(duì)InnoDB使用的影響,需要的朋友可以參考下2015-05-05
本地下載MySQL 8.0.37并上傳服務(wù)器Centos7.9安裝的完整指南
在生產(chǎn)環(huán)境中,我們常常會(huì)遇到服務(wù)器無(wú)法連接外網(wǎng)的情況,這時(shí)候就需要離線安裝MySQL,本文詳細(xì)介紹如何從官網(wǎng)下載MySQL 8.0.37,上傳到CentOS 7.9服務(wù)器并進(jìn)行完整安裝配置,希望對(duì)大家有所幫助2025-11-11
MySQL 有輸入輸出參數(shù)的存儲(chǔ)過程實(shí)例
MySQL 有輸入輸出參數(shù)的存儲(chǔ)過程實(shí)例2009-08-08
MySQL字段默認(rèn)值為NULL時(shí)的避坑指南
在 MySQL 中,字段默認(rèn)值為 NULL 是一種常見設(shè)計(jì),但如果你不小心,NULL 會(huì)成為你系統(tǒng)中最隱蔽的問題源頭之一,本文將通過真實(shí) SQL 示例,帶你了解默認(rèn)值為 NULL 時(shí)常見的“坑”,需要的朋友可以參考下2025-05-05
MySQL?Community?Server?8.0.29安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了MySQL?Community?Server?8.0.29安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

