MySQL分析執(zhí)行次數(shù)最多的SQL的六種方法
在MySQL中分析執(zhí)行次數(shù)最多的SQL,主要有以下幾種方法:
1. 使用MySQL慢查詢?nèi)罩?/h2>
開啟慢查詢?nèi)罩?/h3>
-- 查看慢查詢配置
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';
-- 開啟慢查詢?nèi)罩荆ㄐ柙趍y.cnf中配置持久化)
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1; -- 設(shè)置慢查詢閾值(秒)
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- 查看慢查詢配置 SHOW VARIABLES LIKE 'slow_query_log%'; SHOW VARIABLES LIKE 'long_query_time'; -- 開啟慢查詢?nèi)罩荆ㄐ柙趍y.cnf中配置持久化) SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1; -- 設(shè)置慢查詢閾值(秒) SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
使用mysqldumpslow分析
# 分析執(zhí)行次數(shù)最多的慢查詢 mysqldumpslow -s c -t 10 /var/log/mysql/slow.log # 按執(zhí)行時(shí)間排序 mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
2. 使用Performance Schema
開啟Performance Schema
-- 檢查是否開啟 SHOW VARIABLES LIKE 'performance_schema'; -- 開啟events_statements_history(如果未開啟) UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_statements_history%';
查詢執(zhí)行次數(shù)最多的SQL
SELECT
DIGEST_TEXT AS query,
COUNT_STAR AS exec_count,
AVG_TIMER_WAIT/1000000000000 AS avg_exec_time_sec,
SUM_ROWS_EXAMINED AS rows_examined_sum,
SUM_ROWS_SENT AS rows_sent_sum
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
ORDER BY COUNT_STAR DESC
LIMIT 10;
3. 使用Sys Schema(MySQL 5.7+)
-- 查看執(zhí)行次數(shù)最多的語(yǔ)句
SELECT * FROM sys.statements_with_full_table_scans
ORDER BY exec_count DESC
LIMIT 10;
-- 查看總執(zhí)行次數(shù)最多的語(yǔ)句
SELECT * FROM sys.statement_analysis
ORDER BY exec_count DESC
LIMIT 10;
-- 查看執(zhí)行次數(shù)多的標(biāo)準(zhǔn)化SQL
SELECT
query,
db,
exec_count,
total_latency,
avg_latency,
rows_sent_avg,
rows_examined_avg
FROM sys.x$statements_with_runtimes_in_95th_percentile
ORDER BY exec_count DESC
LIMIT 10;
4. 使用通用日志(不推薦生產(chǎn)環(huán)境)
-- 開啟通用查詢?nèi)罩?
SET GLOBAL general_log = 1;
SET GLOBAL general_log_file = '/var/log/mysql/general.log';
-- 分析日志(示例使用awk)
awk '
{
if ($0 ~ /Query/) {
# 提取SQL語(yǔ)句(簡(jiǎn)化版)
query = substr($0, index($0, "Query:") + 7)
queries[query]++
}
}
END {
for (q in queries) {
print queries[q] " " q
}
}' /var/log/mysql/general.log | sort -nr | head -10
5. 使用INFORMATION_SCHEMA.PROCESSLIST(實(shí)時(shí)監(jiān)控)
-- 查看當(dāng)前執(zhí)行的SQL
SELECT
INFO AS query,
COUNT(*) AS concurrent_count
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Query'
AND INFO IS NOT NULL
GROUP BY INFO
ORDER BY concurrent_count DESC
LIMIT 10;
6. 使用pt-query-digest工具
# 分析慢查詢?nèi)罩? pt-query-digest /var/log/mysql/slow.log # 分析tcpdump抓取的流量 tcpdump -i any -s 65535 -x -nn -q -tttt port 3306 > mysql.tcp.txt pt-query-digest --type tcpdump mysql.tcp.txt # 分析general log pt-query-digest --type genlog /var/log/mysql/general.log
推薦的生產(chǎn)環(huán)境方案
對(duì)于生產(chǎn)環(huán)境,建議組合使用:
- 長(zhǎng)期監(jiān)控:Performance Schema + Sys Schema
- 性能分析:慢查詢?nèi)罩?+ pt-query-digest
- 實(shí)時(shí)監(jiān)控:INFORMATION_SCHEMA.PROCESSLIST
完整的Performance Schema監(jiān)控示例
-- 開啟必要的監(jiān)控項(xiàng)
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'statement/%';
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%statements%';
-- 定期查詢TOP SQL(可做成定時(shí)任務(wù))
SELECT
SCHEMA_NAME as db,
DIGEST_TEXT as query,
COUNT_STAR as exec_count,
ROUND(SUM_TIMER_WAIT/1000000000000, 2) as total_time_sec,
ROUND(AVG_TIMER_WAIT/1000000000000, 4) as avg_time_sec,
SUM_ROWS_EXAMINED as rows_examined,
SUM_ROWS_SENT as rows_sent,
FIRST_SEEN as first_seen,
LAST_SEEN as last_seen
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
AND COUNT_STAR > 0
ORDER BY COUNT_STAR DESC
LIMIT 20;
選擇哪種方法取決于你的具體需求:實(shí)時(shí)監(jiān)控用Performance Schema,深度分析用慢查詢?nèi)罩?,快速排查用Sys Schema。
以上就是MySQL分析執(zhí)行次數(shù)最多的SQL的六種方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL執(zhí)行次數(shù)最多的SQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL復(fù)制與主從架構(gòu)(Master-Slave)詳細(xì)介紹
數(shù)據(jù)庫(kù)的主從架構(gòu)是通過將數(shù)據(jù)從一個(gè)主庫(kù)復(fù)制到一個(gè)或多個(gè)從庫(kù)來實(shí)現(xiàn),該架構(gòu)的核心是數(shù)據(jù)同步,主要用于數(shù)據(jù)的容災(zāi)備份,讀寫分離,數(shù)據(jù)分析場(chǎng)景中,這篇文章主要介紹了MySQL復(fù)制與主從架構(gòu)(Master-Slave)的相關(guān)資料,需要的朋友可以參考下2026-04-04
Express連接MySQL及數(shù)據(jù)庫(kù)連接池技術(shù)實(shí)例
數(shù)據(jù)庫(kù)連接池是程序啟動(dòng)時(shí)建立足夠數(shù)量的數(shù)據(jù)庫(kù)連接對(duì)象,并將這些連接對(duì)象組成一個(gè)池,由程序動(dòng)態(tài)地對(duì)池中的連接對(duì)象進(jìn)行申請(qǐng)、使用和釋放,本文重點(diǎn)給大家介紹Express連接MySQL及數(shù)據(jù)庫(kù)連接池技術(shù),感興趣的朋友一起看看吧2022-02-02
MySQL各種 JOIN 的特點(diǎn)及應(yīng)用場(chǎng)景分析
MySQL中的JOIN操作用于將多個(gè)表中的數(shù)據(jù)關(guān)聯(lián)起來,常見的JOIN 類型包括INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN(MySQL 不直接支持 FULL JOIN,但可通過 UNION 實(shí)現(xiàn)),本文介紹MySQL各種 JOIN 的特點(diǎn)及應(yīng)用場(chǎng)景,感興趣的朋友一起看看吧2025-12-12
MySql獲取當(dāng)前時(shí)間并轉(zhuǎn)換成字符串的實(shí)現(xiàn)
本文主要介紹了MySql獲取當(dāng)前時(shí)間并轉(zhuǎn)換成字符串的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
MySQL8.0無(wú)法啟動(dòng)3534的解決方法
本文主要是記錄一下自己使用MySQL的一次踩坑經(jīng)歷,我的MySQL安裝好后,使用一周后的同一時(shí)間必定報(bào)連接失敗,然后查找發(fā)現(xiàn)是MySQL本地服務(wù)沒有啟動(dòng),下面就詳細(xì)的介紹一下2021-06-06
MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問題解讀
這篇文章主要介紹了MySQL事務(wù)的四大特性以及并發(fā)事務(wù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
MySQL千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于MySQL千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2019-12-12
mysql myisam 優(yōu)化設(shè)置設(shè)置
mysql myisam 優(yōu)化設(shè)置設(shè)置,需要的朋友可以參考下。2010-03-03

