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

SQL性能優(yōu)化之慢SQL查詢方法與排查

 更新時間:2026年04月01日 08:42:58   作者:G探險者  
慢?SQL?是指執(zhí)行時間超過預設閾值的?SQL?語句,本文主要來今天聊一聊sql優(yōu)化的問題,怎么找到那些慢SQL,文中提供了一些常用的方法,希望對大家有所幫助

適用版本:MySQL 5.7 / 8.0

今天聊一聊sql優(yōu)化的問題,怎么找到那些慢SQL。

一、什么是慢 SQL

慢 SQL 是指執(zhí)行時間超過預設閾值的 SQL 語句。在 MySQL 中,這個閾值由參數(shù) long_query_time 控制,默認值為 10 秒,實際生產(chǎn)環(huán)境中通常設置為 1~2 秒。

慢 SQL 是數(shù)據(jù)庫性能問題最常見的根源,主要表現(xiàn)為:

  • 頁面響應緩慢,接口超時
  • 數(shù)據(jù)庫 CPU 飆高,連接數(shù)堆積
  • 鎖等待,導致其他業(yè)務也受影響

二、開啟慢查詢?nèi)罩?/h2>

要找到慢 SQL,首先需要開啟 MySQL 的慢查詢?nèi)罩竟δ堋?/p>

2.1 查看當前狀態(tài)

SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

2.2 臨時開啟(重啟后失效)

-- 開啟慢查詢?nèi)罩?
SET GLOBAL slow_query_log = 'ON';

-- 設置閾值:超過 2 秒算慢 SQL
SET GLOBAL long_query_time = 2;

-- 設置日志輸出到表(推薦,方便直接查詢)
SET GLOBAL log_output = 'TABLE';

2.3 永久生效(修改配置文件)

編輯 MySQL 配置文件 my.cnf(Linux)或 my.ini(Windows):

[mysqld]
slow_query_log = 1
long_query_time = 2
log_output = TABLE
log_queries_not_using_indexes = 1   # 同時記錄未使用索引的 SQL

建議log_queries_not_using_indexes = 1 非常有用,即使執(zhí)行很快但沒走索引的 SQL 也會被記錄,可以提前發(fā)現(xiàn)潛在隱患。

三、方法一:查詢 slow_log 表

log_output = TABLE 時,慢 SQL 會寫入 mysql.slow_log 表,可以直接用 SQL 查詢。

3.1 查詢最近的慢 SQL

SELECT
    start_time,
    ROUND(TIME_TO_SEC(query_time), 3) AS 執(zhí)行秒數(shù),
    ROUND(TIME_TO_SEC(lock_time), 3)  AS 鎖等待秒數(shù),
    rows_examined                      AS 掃描行數(shù),
    rows_sent                          AS 返回行數(shù),
    db                                 AS 數(shù)據(jù)庫,
    sql_text                           AS SQL內(nèi)容
FROM mysql.slow_log
ORDER BY query_time DESC
LIMIT 20;

3.2 按數(shù)據(jù)庫篩選

SELECT * FROM mysql.slow_log
WHERE db = 'your_database'
ORDER BY query_time DESC
LIMIT 20;

四、方法二:performance_schema 分析

performance_schema 是 MySQL 內(nèi)置的性能數(shù)據(jù)采集框架,能統(tǒng)計所有 SQL 的累計執(zhí)行情況,找出高頻且耗時的 SQL。

4.1 查詢最耗時的 TOP 10 SQL

SELECT
    DIGEST_TEXT                                           AS SQL摘要,
    COUNT_STAR                                            AS 執(zhí)行次數(shù),
    ROUND(AVG_TIMER_WAIT / 1000000000000, 3)             AS 平均耗時秒,
    ROUND(MAX_TIMER_WAIT / 1000000000000, 3)             AS 最大耗時秒,
    ROUND(SUM_TIMER_WAIT / 1000000000000, 3)             AS 總耗時秒,
    SUM_ROWS_EXAMINED                                     AS 總掃描行數(shù)
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;

4.2 通過 sys schema 更簡便地查詢

sys schema 是對 performance_schema 的封裝,SQL 更簡潔易讀:

-- 查詢最耗時的 SQL(按總耗時排序)
SELECT * FROM sys.statement_analysis
ORDER BY total_latency DESC
LIMIT 10;

-- 查詢?nèi)頀呙枳疃嗟?SQL
SELECT * FROM sys.statements_with_full_table_scans
ORDER BY no_index_used_count DESC
LIMIT 10;

五、方法三:工具客戶端分析

5.1 MySQL Workbench(推薦)

連接數(shù)據(jù)庫后,在左側(cè)導航找到 Performance 菜單:

  • Performance → Dashboard:實時監(jiān)控面板,查看 QPS、連接數(shù)、緩沖池等
  • Performance → Statement Analysis:列出所有 SQL 及其平均耗時、執(zhí)行次數(shù)
  • Performance → Query Statistics:按類型統(tǒng)計 SELECT/INSERT/UPDATE 的耗時占比

5.2 DBeaver

  • 執(zhí)行 SQL 后,底部結(jié)果面板直接顯示執(zhí)行時間
  • Window → Query Manager:查看歷史 SQL 及每條的耗時
  • 選中 SQL → Ctrl+Shift+E:圖形化執(zhí)行計劃

5.3 Percona PMM(生產(chǎn)環(huán)境推薦)

PMM(Percona Monitoring and Management)是專業(yè)的 MySQL 監(jiān)控平臺,適合生產(chǎn)環(huán)境:

  • Query Analytics 面板:實時展示所有 SQL 的執(zhí)行頻率和耗時
  • 支持按時間段過濾,定位某次性能抖動期間的慢 SQL
  • 可下鉆到單條 SQL 查看執(zhí)行計劃和歷史趨勢

六、找到慢 SQL 后如何分析

找到慢 SQL 只是第一步,接下來需要通過執(zhí)行計劃(EXPLAIN)分析慢的原因。

6.1 使用 EXPLAIN 分析

EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 1;

-- MySQL 8.0+ 支持更詳細的 EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123 AND status = 1;

6.2 關(guān)鍵字段解讀

字段關(guān)注點說明
type最重要ALL = 全表掃描(差),ref / eq_ref = 走索引(好)
key是否用索引NULL 表示未使用任何索引
rows掃描行數(shù)數(shù)值越大性能越差
Extra附加信息Using filesort / Using temporary 需要重點優(yōu)化
filtered過濾比例越低代表從掃描結(jié)果中篩選越多,效率越低

6.3 常見慢 SQL 原因

  • 未建索引,或索引建了但沒有命中(索引失效)
  • SQL 寫法導致索引失效,例如對索引列使用函數(shù)、隱式類型轉(zhuǎn)換
  • SELECT * 拉取了不必要的列,返回數(shù)據(jù)量過大
  • JOIN 關(guān)聯(lián)字段未建索引,產(chǎn)生笛卡爾積
  • 數(shù)據(jù)量大但沒有分頁,一次查詢百萬行數(shù)據(jù)

七、排查流程總結(jié)

步驟操作工具
第一步開啟慢查詢?nèi)罩?/td>SET GLOBAL slow_query_log='ON'
第二步收集慢 SQL 列表查詢 mysql.slow_log 或 sys.statement_analysis
第三步找出最耗時的 SQL按 query_time 降序排列,取 TOP 10
第四步分析執(zhí)行計劃EXPLAIN 命令 或 DBeaver / Workbench 圖形化
第五步定位慢的原因看 type / key / rows / Extra 字段
第六步優(yōu)化處理加索引、改寫 SQL、分頁、分庫分表等

八、常用命令速查

-- 查看慢查詢配置
SHOW VARIABLES LIKE 'slow%';

-- 開啟慢查詢?nèi)罩?
SET GLOBAL slow_query_log = 'ON';

-- 設置慢查詢閾值(秒)
SET GLOBAL long_query_time = 2;

-- 查詢慢 SQL 列表
SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 20;

-- 查 TOP 10 耗時 SQL
SELECT * FROM sys.statement_analysis LIMIT 10;

-- 查全表掃描的 SQL
SELECT * FROM sys.statements_with_full_table_scans LIMIT 10;

-- 分析執(zhí)行計劃
EXPLAIN SELECT ...;

-- 詳細執(zhí)行計劃(MySQL 8.0+)
EXPLAIN ANALYZE SELECT ...;

-- 清空慢日志表
TRUNCATE TABLE mysql.slow_log;

小結(jié):慢 SQL 排查的核心思路是「先發(fā)現(xiàn)、再定位、后優(yōu)化」。建議在測試和生產(chǎn)環(huán)境都長期開啟慢查詢?nèi)罩荆⒍ㄆ跈z查 sys.statement_analysis,做到防患于未然。

到此這篇關(guān)于SQL性能優(yōu)化之慢SQL查詢方法與排查的文章就介紹到這了,更多相關(guān)慢SQL查詢方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL基礎教程之索引的定義與作用

    MySQL基礎教程之索引的定義與作用

    索引是數(shù)據(jù)庫中用于提高數(shù)據(jù)檢索效率的一種數(shù)據(jù)結(jié)構(gòu),它類似于書籍的目錄,允許用戶快速定位到所需數(shù)據(jù)的位置,而無需掃描整個數(shù)據(jù)表,這篇文章主要介紹了MySQL基礎教程之索引定義與作用的相關(guān)資料,需要的朋友可以參考下
    2026-02-02
  • mysql delete limit 使用方法詳解

    mysql delete limit 使用方法詳解

    今天研究cms系統(tǒng)的時候發(fā)現(xiàn),delete 語句后面有個limit,一直都是select查詢的時候才使用,不懂為什么要用這個,正好就百度一下為大家分享下delete中使用limit方法與有點
    2014-11-11
  • MySQL Workbench 安裝教程(保姆級)

    MySQL Workbench 安裝教程(保姆級)

    MySQL Workbench 是一款強大的數(shù)據(jù)庫設計和管理工具,本文主要介紹了MySQL Workbench 安裝教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • mysql中GROUP_CONCAT的使用方法實例分析

    mysql中GROUP_CONCAT的使用方法實例分析

    這篇文章主要介紹了mysql中GROUP_CONCAT的使用方法,結(jié)合實例形式分析了MySQL中GROUP_CONCAT合并查詢結(jié)果的相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • MySQL非常重要的日志bin log詳解

    MySQL非常重要的日志bin log詳解

    bin log想必大家多多少少都有聽過,它是MySQL中一個非常重要的日志,因為它涉及到數(shù)據(jù)庫層面的主從復制、高可用等設計,所以本文就給大家詳細的講解MySQL非常重要的日志—bin log,需要的朋友可以參考下
    2023-07-07
  • 淺談MYSQL中樹形結(jié)構(gòu)表3種設計優(yōu)劣分析與分享

    淺談MYSQL中樹形結(jié)構(gòu)表3種設計優(yōu)劣分析與分享

    在開發(fā)中經(jīng)常遇到樹形結(jié)構(gòu)的場景,本文將以部門表為例對比幾種設計的優(yōu)缺點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MAC下MYSQL數(shù)據(jù)庫密碼忘記的解決辦法

    MAC下MYSQL數(shù)據(jù)庫密碼忘記的解決辦法

    這篇文章主要介紹了Mac操作系統(tǒng)下MYSQL數(shù)據(jù)庫密碼忘記的快速解決辦法,教大家重置MYSQ密碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SQL中表鎖定(LOCK、UNLOCK)的具體使用

    SQL中表鎖定(LOCK、UNLOCK)的具體使用

    本文主要介紹了SQL中表鎖定(LOCK、UNLOCK)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • mysql 8.0.12 安裝使用教程

    mysql 8.0.12 安裝使用教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12 安裝使用教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • MySql 游標和觸發(fā)器概念及使用詳解

    MySql 游標和觸發(fā)器概念及使用詳解

    本文詳細介紹了MySQL中的游標,包括其定義、使用步驟及案例,以及觸發(fā)器的概念、創(chuàng)建和管理,游標用于逐行處理查詢結(jié)果,而觸發(fā)器則在數(shù)據(jù)操作后自動執(zhí)行特定操作,提升數(shù)據(jù)庫操作的靈活性和自動化,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

黄山市| 龙泉市| 乐陵市| 寻甸| 麻江县| 东海县| 昆山市| 将乐县| 六枝特区| 通辽市| 偏关县| 成都市| 睢宁县| 六枝特区| 将乐县| 苍梧县| 盖州市| 秭归县| 南木林县| 扎兰屯市| 宝兴县| 万州区| 阿坝| 嘉善县| 铜梁县| 隆安县| 边坝县| 习水县| 会昌县| 湘乡市| 长沙市| 定州市| 辽中县| 开原市| 新乐市| 仙桃市| 海门市| 米易县| 白水县| 平江县| 辉县市|