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

sql優(yōu)化之如何找到那些慢SQL

 更新時間:2026年05月09日 11:41:35   作者:G探險者  
執(zhí)行SQL語句時,如果出現(xiàn)慢SQL或SQL占用系統(tǒng)內(nèi)存的情況,需進(jìn)行具體查詢分析,這篇文章主要介紹了sql優(yōu)化之如何找到那些慢SQL的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下

適用版本:MySQL 5.7 / 8.0

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

一、什么是慢 SQL?

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

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

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

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

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

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

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

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

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

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

-- 設(shè)置日志輸出到表(推薦,方便直接查詢)
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 表

當(dāng) 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è)導(dǎo)航找到 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+ 支持更詳細(xì)的 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 寫法導(dǎo)致索引失效,例如對索引列使用函數(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_logsys.statement_analysis
第三步找出最耗時的 SQLquery_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';

-- 設(shè)置慢查詢閾值(秒)
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 ...;

-- 詳細(xì)執(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)罩?,并定期檢查 sys.statement_analysis,做到防患于未然。

總結(jié) 

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

相關(guān)文章

  • Ubuntu18.04安裝mysql5.7.23的教程

    Ubuntu18.04安裝mysql5.7.23的教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu18.04安裝mysql5.7.23的教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例

    Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例

    Datediff函數(shù),最大的作用就是計算日期差,能計算兩個格式相同的日期之間的差值,下面這篇文章主要給大家介紹了關(guān)于Mysql中DATEDIFF函數(shù)的基礎(chǔ)語法及練習(xí)案例?的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • mysql 跨表查詢、更新、刪除示例

    mysql 跨表查詢、更新、刪除示例

    這篇文章主要介紹了mysql 跨表查詢、更新、刪除,需要的朋友可以參考下
    2014-03-03
  • mysql模糊匹配多個值的兩種方法實例

    mysql模糊匹配多個值的兩種方法實例

    我們平時使用msyql需要模糊的匹配字段的時候,我們第一反應(yīng)就是使用like查詢語句來模糊匹配,下面這篇文章主要給大家介紹了關(guān)于mysql模糊匹配多個值的兩種方法,需要的朋友可以參考下
    2022-12-12
  • 解決mysql5.6 utf8設(shè)置無效問題

    解決mysql5.6 utf8設(shè)置無效問題

    這篇文章主要介紹了mysql5.6 utf8設(shè)置無效問題,本文雖然內(nèi)容不長,但是解決方法給出,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Mysql中SUM()函數(shù)使用方法

    Mysql中SUM()函數(shù)使用方法

    這篇文章主要給大家介紹了關(guān)于Mysql中SUM()函數(shù)使用的相關(guān)資料,MySQL 的 SUM 函數(shù)可以用來對某個列進(jìn)行求和,但是如果你想要按照某個條件進(jìn)行求和,可以使用帶有WHERE子句的SUM函數(shù),需要的朋友可以參考下
    2023-08-08
  • Mysql報錯1292:Incorrect datetime value for column creat解決方案

    Mysql報錯1292:Incorrect datetime value for 

    本文主要介紹了Mysql報錯1292:Incorrect datetime value for column create_time at row 1 解決方案,1292 是指插入或更新操作時,日期或時間值不正確引起的錯誤,下面就來介紹一下
    2024-02-02
  • MySQL三大日志(binlog、redo?log和undo?log)圖文詳解

    MySQL三大日志(binlog、redo?log和undo?log)圖文詳解

    日志是MySQL數(shù)據(jù)庫的重要組成部分,記錄著數(shù)據(jù)庫運行期間各種狀態(tài)信息,下面這篇文章主要給大家介紹了關(guān)于MySQL三大日志(binlog、redo?log和undo?log)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • mysql增加外鍵約束具體方法

    mysql增加外鍵約束具體方法

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql增加外鍵約束具體方法及相關(guān)實例內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-12-12
  • mysql、oracle默認(rèn)事務(wù)隔離級別的說明

    mysql、oracle默認(rèn)事務(wù)隔離級別的說明

    這篇文章主要介紹了mysql、oracle默認(rèn)事務(wù)隔離級別的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論

综艺| 临邑县| 株洲市| 河东区| 乃东县| 临武县| 南城县| 山西省| 兴仁县| 五家渠市| 阿拉尔市| 璧山县| 四子王旗| 芦溪县| 天柱县| 陇川县| 云和县| 林周县| 正安县| 金阳县| 页游| 宜兰市| 塔河县| 晋宁县| 广安市| 安新县| 曲松县| 古蔺县| 渭南市| 栾川县| 新丰县| 修文县| 永丰县| 文登市| 诸城市| 达拉特旗| 左权县| 阜新市| 丽水市| 绥棱县| 临潭县|