最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL慢查詢?nèi)罩緩呐渲玫絻?yōu)化實(shí)踐全解析

 更新時(shí)間:2026年01月21日 16:46:28   作者:小Mie不吃飯  
慢查詢?nèi)罩臼荕ySQL性能優(yōu)化的關(guān)鍵工具,記錄執(zhí)行時(shí)間超過閾值的SQL語句,幫助定位性能瓶頸和優(yōu)化SQL,本文介紹MySQL慢查詢?nèi)罩緩呐渲玫絻?yōu)化實(shí)踐全解析,感興趣的朋友跟隨小編一起看看吧

慢查詢?nèi)罩臼荕ySQL性能優(yōu)化的核心工具之一,掌握其配置、分析和優(yōu)化方法,是架構(gòu)師和DBA必備的核心技能。

本文將從基礎(chǔ)概念到實(shí)戰(zhàn)優(yōu)化,全面講解慢查詢?nèi)罩镜氖褂梅椒ê妥罴褜?shí)踐。

一、什么是慢查詢?nèi)罩?/h2>

慢查詢?nèi)罩荆⊿low Query Log)是 MySQL 內(nèi)置的日志功能,專門用于記錄執(zhí)行時(shí)間超過預(yù)設(shè)閾值(long_query_time)的 SQL 語句。它就像MySQL的“性能黑匣子”,能精準(zhǔn)定位執(zhí)行效率低下的SQL,是數(shù)據(jù)庫性能優(yōu)化的核心抓手。

二、核心作用

  • 性能診斷:快速定位系統(tǒng)中執(zhí)行效率低的SQL語句,找到性能短板。
  • 瓶頸定位:分析慢查詢的根因(如全表掃描、索引缺失、鎖等待等)。
  • 優(yōu)化依據(jù):為SQL改寫、索引調(diào)整、數(shù)據(jù)庫參數(shù)優(yōu)化提供數(shù)據(jù)支撐。
  • 容量規(guī)劃:通過慢查詢趨勢(shì),預(yù)判數(shù)據(jù)庫性能瓶頸和擴(kuò)容需求。

三、配置參數(shù)詳解

通過以下命令可查看所有慢查詢相關(guān)配置參數(shù):

-- 查看慢查詢相關(guān)參數(shù)
SHOW VARIABLES LIKE '%slow%';
-- 查看慢查詢閾值參數(shù)
SHOW VARIABLES LIKE '%long_query_time%';

核心配置參數(shù)說明:

參數(shù)名取值說明
slow_query_logOFF/ON是否開啟慢查詢?nèi)罩荆J(rèn)關(guān)閉)
slow_query_log_file路徑字符串慢查詢?nèi)罩疚募拇鎯?chǔ)路徑(如/var/log/mysql/slow.log
long_query_time數(shù)值(秒)慢查詢閾值,默認(rèn)10秒(MySQL 5.7+支持微秒級(jí),如0.5表示500毫秒)
min_examined_row_limit數(shù)值最少檢查行數(shù)閾值,低于該值的慢查詢不記錄(默認(rèn)0)
log_queries_not_using_indexesOFF/ON是否記錄未使用索引的查詢(即使執(zhí)行時(shí)間未達(dá)閾值)
log_slow_admin_statementsOFF/ON是否記錄慢管理語句(如ALTER TABLE、ANALYZE TABLE等)
log_outputFILE/TABLE/NONE日志輸出方式:文件/數(shù)據(jù)庫表/不輸出

四、開啟和配置

1. 臨時(shí)開啟(重啟失效)

適用于臨時(shí)調(diào)試,MySQL重啟后配置會(huì)恢復(fù)默認(rèn)值:

-- 開啟慢查詢?nèi)罩?
SET GLOBAL slow_query_log = 'ON';
-- 設(shè)置慢查詢閾值為2秒
SET GLOBAL long_query_time = 2;
-- 指定日志文件路徑
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
-- 記錄未使用索引的查詢
SET GLOBAL log_queries_not_using_indexes = 'ON';

2. 永久開啟(修改配置文件)

修改MySQL配置文件(my.cnf/my.ini),重啟后生效,適用于生產(chǎn)環(huán)境:

[mysqld]
# 開啟慢查詢?nèi)罩荆?=開啟,0=關(guān)閉)
slow_query_log = 1
# 日志文件路徑
slow_query_log_file = /var/log/mysql/slow.log
# 慢查詢閾值(秒)
long_query_time = 2
# 記錄未使用索引的查詢
log_queries_not_using_indexes = 1
# 日志輸出到文件
log_output = FILE
# 可選:記錄慢管理語句
log_slow_admin_statements = 1
# 可選:最少檢查行數(shù)閾值
min_examined_row_limit = 100

修改完成后重啟MySQL服務(wù):

# CentOS/RHEL
systemctl restart mysqld
# Ubuntu/Debian
systemctl restart mysql

五、慢查詢?nèi)罩靖袷椒治?/h2>

典型日志條目

# Time: 2024-01-01T10:00:00.123456Z
# User@Host: root[root] @ localhost []  Id:     5
# Query_time: 5.123456  Lock_time: 0.001000  Rows_sent: 10  Rows_examined: 1000000
SET timestamp=1672560000;
SELECT * FROM users WHERE last_name LIKE '%smith%' ORDER BY create_time DESC;

關(guān)鍵字段解釋

字段名說明
Time查詢執(zhí)行的時(shí)間戳(UTC時(shí)間)
User@Host執(zhí)行查詢的用戶和主機(jī)信息
Id數(shù)據(jù)庫連接ID
Query_time查詢總執(zhí)行時(shí)間(秒,含微秒)
Lock_time查詢過程中鎖等待時(shí)間(秒)
Rows_sent返回給客戶端的行數(shù)
Rows_examined數(shù)據(jù)庫掃描的行數(shù)(核心指標(biāo),行數(shù)越多性能越差)
Rows_affected受DML語句(UPDATE/DELETE/INSERT)影響的行數(shù)
timestamp查詢開始的UNIX時(shí)間戳

六、慢查詢分析工具

1. mysqldumpslow(MySQL 自帶)

MySQL內(nèi)置的輕量級(jí)分析工具,無需額外安裝,適合快速匯總慢查詢:

# 按查詢時(shí)間排序,顯示最慢的前10條
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
# 按執(zhí)行次數(shù)排序
mysqldumpslow -s c /var/log/mysql/slow.log
# 按鎖時(shí)間排序
mysqldumpslow -s l /var/log/mysql/slow.log
# 分析特定用戶的慢查詢(保留原始SQL)
mysqldumpslow -a -g "root" /var/log/mysql/slow.log

2. pt-query-digest(Percona Toolkit)

Percona出品的專業(yè)分析工具,功能強(qiáng)大,是生產(chǎn)環(huán)境首選:

安裝(以CentOS為例):

yum install percona-toolkit -y
常用命令:
# 基礎(chǔ)分析,輸出詳細(xì)報(bào)告
pt-query-digest /var/log/mysql/slow.log
# 分析最近12小時(shí)的慢查詢
pt-query-digest --since=12h /var/log/mysql/slow.log
# 分析指定時(shí)間段的慢查詢
pt-query-digest --since='2024-01-01 00:00:00' --until='2024-01-01 23:59:59' /var/log/mysql/slow.log
# 將分析結(jié)果輸出到文件
pt-query-digest /var/log/mysql/slow.log > /tmp/slow_report_$(date +%Y%m%d).txt

3. mysqlslow(第三方工具)

輕量級(jí)第三方工具,安裝簡單,輸出結(jié)果直觀:

# 安裝(需先安裝pip)
pip install mysqlslow
# 分析慢查詢?nèi)罩?
mysqlslow /var/log/mysql/slow.log

七、慢查詢?nèi)罩颈砟J?/h2>

除了文件存儲(chǔ),MySQL還支持將慢查詢?nèi)罩敬鎯?chǔ)到數(shù)據(jù)庫表中,便于SQL查詢分析。

啟用表模式存儲(chǔ):

-- 設(shè)置日志輸出到表(FILE,TABLE 表示同時(shí)輸出到文件和表)
SET GLOBAL log_output = 'TABLE';
-- 開啟慢查詢?nèi)罩?
SET GLOBAL slow_query_log = 'ON';
-- 查詢慢查詢?nèi)罩颈?
SELECT * FROM mysql.slow_log;

表結(jié)構(gòu):

SHOW CREATE TABLE mysql.slow_log;

核心字段說明:

字段名類型說明
start_timeDATETIME(6)查詢開始時(shí)間(含微秒)
query_timeTIME(6)查詢執(zhí)行時(shí)間
lock_timeTIME(6)鎖等待時(shí)間
rows_sentINT UNSIGNED返回行數(shù)
rows_examinedINT UNSIGNED掃描行數(shù)
sql_textLONGTEXTSQL語句內(nèi)容
user_hostMEDIUMTEXT用戶和主機(jī)信息

注意:表模式存儲(chǔ)會(huì)增加數(shù)據(jù)庫寫入壓力,生產(chǎn)環(huán)境建議優(yōu)先使用文件模式。

八、最佳實(shí)踐和優(yōu)化建議

1. 閾值設(shè)置建議

閾值需根據(jù)業(yè)務(wù)場(chǎng)景調(diào)整,避免記錄過多無效日志或遺漏關(guān)鍵慢查詢:

-- 生產(chǎn)環(huán)境(平衡性能和排查需求)
SET GLOBAL long_query_time = 2;    -- 2秒閾值
-- 開發(fā)/測(cè)試環(huán)境(嚴(yán)格排查)
SET GLOBAL long_query_time = 0.5;  -- 500毫秒
-- 高并發(fā)核心業(yè)務(wù)(微秒級(jí)監(jiān)控,MySQL 5.7+)
SET GLOBAL long_query_time = 0.1;  -- 100毫秒

2. 日志輪轉(zhuǎn)配置

避免慢查詢?nèi)罩疚募^大,使用logrotate實(shí)現(xiàn)日志自動(dòng)輪轉(zhuǎn):

# /etc/logrotate.d/mysql-slow
/var/log/mysql/slow.log {
    daily          # 每日輪轉(zhuǎn)
    rotate 30      # 保留30天日志
    missingok      # 日志文件不存在時(shí)不報(bào)錯(cuò)
    compress       # 壓縮舊日志
    delaycompress  # 延遲壓縮(保留最新的輪轉(zhuǎn)文件未壓縮)
    notifempty     # 空文件不輪轉(zhuǎn)
    create 640 mysql mysql  # 新建日志文件的權(quán)限和屬主
    postrotate     # 輪轉(zhuǎn)后執(zhí)行的命令
        mysqladmin flush-logs  # 刷新日志,生成新文件
    endscript
}

3. 定期分析計(jì)劃

編寫自動(dòng)化腳本,每日分析慢查詢并歸檔,示例:

#!/bin/bash
# /usr/local/bin/analyze_slow_log.sh
# 腳本功能:每日分析慢查詢?nèi)罩静w檔
# 定義變量
DATE=$(date +%Y%m%d)
LOG_PATH="/var/log/mysql"
REPORT_PATH="${LOG_PATH}/reports"
SLOW_LOG="${LOG_PATH}/slow.log"
# 創(chuàng)建報(bào)告目錄
mkdir -p ${REPORT_PATH}
# 使用pt-query-digest分析日志并生成報(bào)告
pt-query-digest ${SLOW_LOG} > ${REPORT_PATH}/slow_report_${DATE}.txt
# 備份并清空原日志文件
cp ${SLOW_LOG} ${LOG_PATH}/slow.log.${DATE}
> ${SLOW_LOG}
# 清理30天前的舊報(bào)告
find ${REPORT_PATH} -name "slow_report_*.txt" -mtime +30 -delete

添加到crontab,每日凌晨執(zhí)行:

# 編輯crontab
crontab -e
# 添加以下內(nèi)容
0 0 * * * /usr/local/bin/analyze_slow_log.sh > /dev/null 2>&1

九、性能監(jiān)控和告警

1. 監(jiān)控慢查詢數(shù)量

通過MySQL狀態(tài)變量實(shí)時(shí)監(jiān)控慢查詢數(shù)量:

-- 查看累計(jì)慢查詢數(shù)量
SHOW GLOBAL STATUS LIKE 'Slow_queries';
-- 查看當(dāng)前正在執(zhí)行的慢查詢
SHOW PROCESSLIST;
-- 或更詳細(xì)的信息
SHOW FULL PROCESSLIST;

2. 慢查詢告警腳本

編寫腳本監(jiān)控慢查詢數(shù)量,超過閾值時(shí)發(fā)送告警:

#!/bin/bash
# /usr/local/bin/slow_query_alert.sh
# 配置參數(shù)
MYSQL_CMD="mysql -uroot -p'你的密碼' -e"
THRESHOLD=100  # 慢查詢閾值
ALERT_EMAIL="admin@example.com"
# 獲取當(dāng)前慢查詢總數(shù)
SLOW_COUNT=$($MYSQL_CMD "SHOW GLOBAL STATUS LIKE 'Slow_queries'" | grep Slow_queries | awk '{print $2}')
# 對(duì)比閾值并發(fā)送告警
if [ $SLOW_COUNT -gt $THRESHOLD ]; then
    SUBJECT="【告警】MySQL慢查詢數(shù)量異常"
    CONTENT="當(dāng)前慢查詢總數(shù):${SLOW_COUNT},超過閾值${THRESHOLD}!\n請(qǐng)及時(shí)登錄數(shù)據(jù)庫排查慢查詢。"
    echo -e ${CONTENT} | mail -s "${SUBJECT}" ${ALERT_EMAIL}
fi

添加到crontab,每分鐘執(zhí)行一次:

* * * * * /usr/local/bin/slow_query_alert.sh > /dev/null 2>&1

十、注意事項(xiàng)

  • 性能影響:開啟慢查詢?nèi)罩緯?huì)增加約1-3%的數(shù)據(jù)庫性能開銷(主要是磁盤I/O),生產(chǎn)環(huán)境需評(píng)估后開啟。
  • 磁盤空間:慢查詢?nèi)罩驹鲩L較快,必須配置日志輪轉(zhuǎn),避免占滿磁盤。
  • 敏感信息:日志中可能包含用戶密碼、業(yè)務(wù)敏感數(shù)據(jù),需限制日志文件的訪問權(quán)限(如僅root和mysql用戶可讀?。?。
  • 版本差異:MySQL 5.7+支持long_query_time的微秒級(jí)精度,5.6及以下版本僅支持秒級(jí);8.0版本默認(rèn)日志格式有小幅調(diào)整。
  • 測(cè)試驗(yàn)證:開啟慢查詢后,需執(zhí)行SELECT SLEEP(3);(假設(shè)閾值為2秒)驗(yàn)證日志是否正常記錄。
  • 索引記錄log_queries_not_using_indexes開啟后,會(huì)記錄大量簡單的無索引查詢(如SELECT * FROM t LIMIT 1),需結(jié)合min_examined_row_limit過濾。

面試回答(精簡版)

慢查詢?nèi)罩臼荕ySQL記錄執(zhí)行時(shí)間超過閾值SQL的核心工具,就像數(shù)據(jù)庫的“性能病歷本”,是優(yōu)化的關(guān)鍵依據(jù)。

核心回答要點(diǎn):

  • 開啟配置:生產(chǎn)環(huán)境通過修改my.cnf永久開啟,核心參數(shù)包括slow_query_log=1(開啟)、long_query_time=2(閾值)、log_queries_not_using_indexes=1(記錄無索引查詢)。
  • 分析工具:常用mysqldumpslow(快速匯總)和pt-query-digest(專業(yè)分析),重點(diǎn)關(guān)注Query_time(執(zhí)行時(shí)間)、Rows_examined(掃描行數(shù))等字段。
  • 優(yōu)化思路:找到慢查詢后,用EXPLAIN分析執(zhí)行計(jì)劃,核心優(yōu)化手段包括:添加合適的索引、改寫SQL(避免SELECT *、優(yōu)化子查詢)、調(diào)整數(shù)據(jù)庫參數(shù)(如緩沖池)。
  • 最佳實(shí)踐:生產(chǎn)環(huán)境設(shè)置合理閾值(2秒),配置日志輪轉(zhuǎn),定期自動(dòng)分析并設(shè)置告警,平衡性能開銷和問題排查需求。

總結(jié)

  • 慢查詢?nèi)罩臼荕ySQL性能優(yōu)化的核心工具,核心配置參數(shù)為slow_query_log(開關(guān))、long_query_time(閾值)、log_queries_not_using_indexes(無索引查詢記錄)。
  • 生產(chǎn)環(huán)境建議通過修改配置文件永久開啟,結(jié)合logrotate實(shí)現(xiàn)日志輪轉(zhuǎn),使用pt-query-digest進(jìn)行專業(yè)分析。
  • 慢查詢優(yōu)化的核心思路是:通過日志定位慢SQL → 用EXPLAIN分析執(zhí)行計(jì)劃 → 針對(duì)性優(yōu)化(加索引/改SQL/調(diào)參數(shù)),并建立定期分析和告警機(jī)制。

到此這篇關(guān)于MySQL慢查詢?nèi)罩緩呐渲玫絻?yōu)化實(shí)踐全解析的文章就介紹到這了,更多相關(guān)mysql慢查詢?nèi)罩緝?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql去重的兩種方法詳解及實(shí)例代碼

    mysql去重的兩種方法詳解及實(shí)例代碼

    這篇文章主要介紹了mysql去重的兩種方法詳解及實(shí)例代碼的相關(guān)資料,這里對(duì)去重的兩種方法進(jìn)行了一一實(shí)例詳解,需要的朋友可以參考下
    2017-01-01
  • 計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn) mysql alter命令

    計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn) mysql alter命令

    這篇文章主要為大家詳細(xì)介紹了計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn),詳細(xì)介紹了mysql中alter命令的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 如何修改MYSQL5.7.17數(shù)據(jù)庫存儲(chǔ)文件的路徑

    如何修改MYSQL5.7.17數(shù)據(jù)庫存儲(chǔ)文件的路徑

    在搭建華為云服務(wù)器的時(shí)候遇到點(diǎn)問題,查看了網(wǎng)上好多的帖子都沒能解決,不知道有沒有跟我遇到一樣問題的老鐵,我就把我的解決辦法分享給大家,希望能夠幫助各位老鐵
    2023-05-05
  • mysql insert if not exists防止插入重復(fù)記錄的方法

    mysql insert if not exists防止插入重復(fù)記錄的方法

    在 MySQL 中,插入(insert)一條記錄很簡單,但是一些特殊應(yīng)用,在插入記錄前,需要檢查這條記錄是否已經(jīng)存在,只有當(dāng)記錄不存在時(shí)才執(zhí)行插入操作,本文介紹的就是這個(gè)問題的解決方案。
    2011-04-04
  • mysql忘記root密碼的解決辦法(針對(duì)不同mysql版本)

    mysql忘記root密碼的解決辦法(針對(duì)不同mysql版本)

    這篇文章主要介紹了mysql忘記root密碼的解決辦法(針對(duì)不同mysql版本),文章通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • CentOS7環(huán)境下安裝MySQL5.5數(shù)據(jù)庫

    CentOS7環(huán)境下安裝MySQL5.5數(shù)據(jù)庫

    大家好,本篇文章主要講的是CentOS7環(huán)境下安裝MySQL5.5數(shù)據(jù)庫,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • MySQL中索引與視圖的用法與區(qū)別詳解

    MySQL中索引與視圖的用法與區(qū)別詳解

    索引與視圖是我們?cè)谌粘J褂胢ysql必不可少的一部分,最近在學(xué)習(xí)中看到一本書中關(guān)于這方法寫的不錯(cuò),所以這篇文章主要給大家介紹了關(guān)于MySQL中索引與視圖的使用與區(qū)別的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 分享下mysql各個(gè)主要版本之間的差異

    分享下mysql各個(gè)主要版本之間的差異

    因?yàn)閙ysql的版本較多,而且又被oracle公司收購,所有很多朋友不是很清楚各個(gè)版本的區(qū)別,這里簡單介紹下,方便需要的朋友
    2013-06-06
  • Win7下安裝MySQL5.7.16過程記錄

    Win7下安裝MySQL5.7.16過程記錄

    這篇文章主要為大家分享了Win7下安裝MySQL5.7.16過程的筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL性能優(yōu)化之table_cache配置參數(shù)淺析

    MySQL性能優(yōu)化之table_cache配置參數(shù)淺析

    這篇文章主要介紹了MySQL性能優(yōu)化之table_cache配置參數(shù)淺析,本文介紹了它的緩存機(jī)制、參數(shù)優(yōu)化及清空緩存的命令等,需要的朋友可以參考下
    2014-07-07

最新評(píng)論

平南县| 乌拉特前旗| 广宁县| 苗栗县| 盖州市| 油尖旺区| 崇文区| 敖汉旗| 拉萨市| 桂平市| 馆陶县| 景德镇市| 泰和县| 特克斯县| 绵竹市| 邹平县| 日喀则市| 青河县| 耒阳市| 四会市| 丽水市| 肇庆市| 南部县| 清新县| 沅江市| 晋江市| 高密市| 泰宁县| 额敏县| 年辖:市辖区| 靖安县| 金溪县| 关岭| 古蔺县| 顺义区| 永州市| 军事| 林周县| 苏尼特右旗| 靖州| 即墨市|