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

MySQL中慢SQL的監(jiān)控與優(yōu)化技巧

 更新時(shí)間:2025年08月04日 10:58:47   作者:碼農(nóng)技術(shù)棧  
當(dāng)你的應(yīng)用越來越慢,用戶開始抱怨卡頓,數(shù)據(jù)庫CPU飆升到100%——很可能就是慢SQL在作祟!別擔(dān)心,今天我將帶你從零開始掌握MySQL慢SQL的監(jiān)控與優(yōu)化技巧,讓你的數(shù)據(jù)庫性能提升10倍,需要的朋友可以參考下

一、什么是慢SQL?——數(shù)據(jù)庫的"交通堵塞"

慢SQL的定義

慢SQL是指執(zhí)行時(shí)間超過設(shè)定閾值(通常0.5-2秒)的SQL語句。就像高速路上的事故車,它會(huì)阻塞整個(gè)交通流!

慢SQL的典型危害

危害類型影響經(jīng)濟(jì)損失
用戶體驗(yàn)頁面卡頓、超時(shí)用戶流失增加30%
系統(tǒng)資源CPU/內(nèi)存耗盡服務(wù)器成本增加50%
業(yè)務(wù)影響訂單丟失、支付失敗每分鐘損失$1000+
團(tuán)隊(duì)壓力緊急故障處理開發(fā)效率下降40%

二、開啟慢SQL監(jiān)控:安裝"交通攝像頭"

1. 配置慢查詢?nèi)罩?/h3>
-- 查看當(dāng)前設(shè)置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

-- 動(dòng)態(tài)開啟(重啟失效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 1秒閾值
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

-- 永久生效(my.cnf)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1 -- 記錄無索引查詢
log_output = FILE

2. 性能模式監(jiān)控

-- 開啟性能監(jiān)控
UPDATE setup_consumers SET ENABLED = 'YES' 
WHERE NAME LIKE '%events_statements%';

-- 查看慢SQL統(tǒng)計(jì)
SELECT * FROM events_statements_summary_by_digest 
WHERE SUM_TIMER_WAIT > 1000000000000; -- 查詢超過1秒的SQL

3. 慢查詢?nèi)罩靖袷浇馕?/h3>
# Time: 2023-10-05T08:12:34.123456Z
# User@Host: root[root] @ localhost []  Id:    15
# Query_time: 5.123456  Lock_time: 0.001000 Rows_sent: 10  Rows_examined: 100000
SET timestamp=1696493554;
SELECT * FROM orders WHERE status='pending' AND amount > 100;

關(guān)鍵字段:

  • Query_time:SQL執(zhí)行時(shí)間
  • Rows_examined:掃描行數(shù)
  • Rows_sent:返回行數(shù)
  • Lock_time:鎖定時(shí)間

三、分析慢SQL:找出"堵點(diǎn)"原因

1. EXPLAIN命令詳解

EXPLAIN SELECT * FROM users WHERE age > 30 AND country = 'CN';

2. 關(guān)鍵指標(biāo)解讀表

指標(biāo)理想值問題值優(yōu)化建議
typeconst, refALL添加索引
key索引名NULL優(yōu)化查詢條件
rows<1000>10000減少掃描范圍
ExtraUsing indexUsing temporary避免臨時(shí)表

3. 可視化分析工具

pt-query-digest使用:

# 安裝Percona Toolkit
sudo apt install percona-toolkit

# 分析慢日志
pt-query-digest /var/log/mysql/slow.log

# 輸出報(bào)告示例
# 220ms avg, 95% 350ms, 最大耗時(shí)2.5s
# 執(zhí)行次數(shù):120次/天
# 建議:添加索引(status,amount)

四、十大慢SQL優(yōu)化技巧:從入門到精通

1. 索引優(yōu)化:數(shù)據(jù)庫的"高速公路"

-- 添加組合索引
CREATE INDEX idx_status_amount ON orders(status, amount);

-- 刪除冗余索引
DROP INDEX idx_status ON orders;

索引優(yōu)化矩陣:

場景索引策略效果
WHERE條件組合索引????
ORDER BY排序字段索引???
JOIN字段外鍵索引????
高基數(shù)字段B-Tree索引????

2. 查詢重寫:更高效的表達(dá)

-- 優(yōu)化前(函數(shù)導(dǎo)致索引失效)
SELECT * FROM orders WHERE YEAR(create_time) = 2023;

-- 優(yōu)化后
SELECT * FROM orders 
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';

3. 避免SELECT *:精準(zhǔn)數(shù)據(jù)獲取

-- 優(yōu)化前
SELECT * FROM products;

-- 優(yōu)化后
SELECT id, name, price FROM products;

4. 深度分頁優(yōu)化

-- 傳統(tǒng)分頁(慢)
SELECT * FROM orders LIMIT 1000000, 20;

-- 游標(biāo)分頁(快)
SELECT * FROM orders WHERE id > 1000000 LIMIT 20;

5. 批量操作:減少交互次數(shù)

// Java示例:批量插入
PreparedStatement ps = conn.prepareStatement("INSERT INTO logs VALUES (?)");
for (String log : logs) {
    ps.setString(1, log);
    ps.addBatch(); // 添加到批處理
}
ps.executeBatch(); // 批量執(zhí)行

6. 合理使用JOIN

-- 使用EXISTS代替JOIN
SELECT * FROM users u
WHERE EXISTS (
    SELECT 1 FROM orders o 
    WHERE o.user_id = u.id AND o.amount > 1000
);

7. 控制事務(wù)大小

-- 小事務(wù)提交
START TRANSACTION;
INSERT INTO ...; -- 少量操作
COMMIT;

8. 使用覆蓋索引

-- 創(chuàng)建覆蓋索引
CREATE INDEX idx_cover ON orders(user_id, status);

-- 查詢只需索引
SELECT user_id, status FROM orders WHERE user_id=100;

9. 分區(qū)表優(yōu)化

-- 按時(shí)間分區(qū)
CREATE TABLE logs (
    id INT,
    log_time DATETIME
) PARTITION BY RANGE (YEAR(log_time)) (
    PARTITION p2020 VALUES LESS THAN (2021),
    PARTITION p2021 VALUES LESS THAN (2022)
);

10. 架構(gòu)升級

五、自動(dòng)化監(jiān)控工具:24小時(shí)守護(hù)

工具對比表

工具類型功能適用場景
Prometheus+Grafana開源可視化監(jiān)控云原生環(huán)境
MySQL Enterprise Monitor商業(yè)實(shí)時(shí)監(jiān)控企業(yè)用戶
pt-query-digest命令行慢日志分析深度分析
Percona Monitoring and Management開源全套監(jiān)控DBA首選

Prometheus監(jiān)控配置

# prometheus.yml
scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['mysql-server:9104']
    metrics_path: /metrics

Grafana儀表盤示例

六、實(shí)戰(zhàn)案例:電商系統(tǒng)優(yōu)化之旅

問題場景

  • 訂單查詢超時(shí)(>5秒)
  • 高峰期數(shù)據(jù)庫CPU 100%
  • 每分鐘超時(shí)錯(cuò)誤50+

優(yōu)化過程

優(yōu)化效果

指標(biāo)優(yōu)化前優(yōu)化后提升
平均響應(yīng)時(shí)間4200ms35ms120倍
CPU使用率100%20%5倍資源釋放
錯(cuò)誤率15%0.1%99%下降
用戶滿意度差評率30%好評率95%體驗(yàn)升級

七、預(yù)防慢SQL:最佳實(shí)踐

開發(fā)規(guī)范清單

  1. 所有查詢使用EXPLAIN分析
  2. 避免全表掃描(type=ALL)
  3. 為WHERE條件列添加索引
  4. 禁止超過3表JOIN
  5. 事務(wù)內(nèi)操作不超過5條SQL
  6. 分頁查詢使用游標(biāo)模式
  7. 批量操作代替循環(huán)操作
  8. 定期進(jìn)行SQL審查

持續(xù)優(yōu)化流程

八、總結(jié):慢SQL優(yōu)化黃金法則

優(yōu)化金字塔

終極忠告

慢SQL優(yōu)化是"治未病"的藝術(shù)——最好的優(yōu)化是在問題發(fā)生前預(yù)防!

行動(dòng)指南:

  1. 立即開啟慢查詢?nèi)罩?/li>
  2. 分析TOP 10慢SQL
  3. 實(shí)施優(yōu)化方案
  4. 建立監(jiān)控告警
  5. 制定開發(fā)規(guī)范

記住:數(shù)據(jù)庫優(yōu)化不是一次性的任務(wù),而是持續(xù)的過程。現(xiàn)在就開始你的優(yōu)化之旅吧!

(本文基于MySQL 8.0,部分命令在舊版本中可能不同)

以上就是MySQL中慢SQL的監(jiān)控與優(yōu)化技巧的詳細(xì)內(nèi)容,更多關(guān)于MySQL慢SQL監(jiān)控與優(yōu)化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決mysql使用not in 包含null值的問題

    解決mysql使用not in 包含null值的問題

    這篇文章主要介紹了解決mysql使用not in 包含null值的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • mysql數(shù)據(jù)庫入門第一步之創(chuàng)建表

    mysql數(shù)據(jù)庫入門第一步之創(chuàng)建表

    關(guān)于mysql介紹網(wǎng)上一搜一大堆,這里就不再介紹了,我之后的mysql文章只講最簡單基礎(chǔ)的用法,主要是為java程序服務(wù)的.文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下
    2021-05-05
  • MySQL?WHERE語句用法小結(jié)

    MySQL?WHERE語句用法小結(jié)

    給定一條SQL,如何提取其中的where條件,where條件中的每個(gè)子條件,在SQL執(zhí)行的過程中有分別起著什么樣的作用,本文就來介紹一下MySQL?WHERE?條件語句用法小結(jié),感興趣的可以了解一下
    2024-01-01
  • MYSQL查詢時(shí)間范圍內(nèi)的數(shù)據(jù)示例代碼

    MYSQL查詢時(shí)間范圍內(nèi)的數(shù)據(jù)示例代碼

    這篇文章主要介紹了MYSQL查詢時(shí)間范圍內(nèi)的數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • mybatis 模糊查詢的實(shí)現(xiàn)方法

    mybatis 模糊查詢的實(shí)現(xiàn)方法

    這篇文章主要介紹了mybatis 模糊查詢的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • mysql 獲取時(shí)間方式

    mysql 獲取時(shí)間方式

    這篇文章主要介紹了mysql 獲取時(shí)間方式,獲取指定時(shí)間,獲取當(dāng)前時(shí)間等相關(guān)內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2022-03-03
  • mysql中insert語句的5種用法簡單示例

    mysql中insert語句的5種用法簡單示例

    這篇文章主要給大家介紹了關(guān)于mysql中insert語句的5種用法的相關(guān)資料,insert into是mysql中最常用的插入語句,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Mysql數(shù)據(jù)庫亂碼問題的對應(yīng)方式

    Mysql數(shù)據(jù)庫亂碼問題的對應(yīng)方式

    今天小編就為大家分享一篇關(guān)于Mysql數(shù)據(jù)庫亂碼問題的對應(yīng)方式,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 基于sql語句的一些常用語法積累總結(jié)

    基于sql語句的一些常用語法積累總結(jié)

    本篇文章是對一些常用的sql語句進(jìn)行了總結(jié)與分析,需要的朋友參考下
    2013-06-06
  • mysql使用物理備份安裝xtrabackup的詳細(xì)過程

    mysql使用物理備份安裝xtrabackup的詳細(xì)過程

    這篇文章主要介紹了mysql使用物理備份安裝xtrabackup的詳細(xì)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05

最新評論

鹰潭市| 彩票| 大渡口区| 侯马市| 华坪县| 天峻县| 边坝县| 宣威市| 衡南县| 牙克石市| 遵化市| 报价| 汶川县| 赣榆县| 房产| 乐昌市| 扎赉特旗| 沅江市| 兴和县| 梁河县| 延吉市| 原平市| 濉溪县| 陇西县| 靖边县| 临江市| 高淳县| 康定县| 石柱| 桂东县| 甘孜县| 定安县| 永年县| 金溪县| 阿坝县| 德昌县| 南安市| 武陟县| 枝江市| 涟水县| 咸阳市|