chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MySQL慢查詢終極優(yōu)化指南

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-08-13 15:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

MySQL慢查詢終極優(yōu)化指南:從0.8秒到8毫秒的性能飛躍實戰(zhàn)

真實案例:某電商平臺訂單查詢接口從平均響應時間800ms優(yōu)化到8ms,QPS從200提升到2000+,這背后的優(yōu)化思路和實操步驟全揭秘!

作為一名在生產環(huán)境摸爬滾打多年的運維工程師,我見過太多因為慢查詢導致的線上故障。今天分享一套經過實戰(zhàn)檢驗的MySQL慢查詢分析與索引優(yōu)化方法論,幫你徹底解決數(shù)據(jù)庫性能瓶頸。

慢查詢的真實危害:不僅僅是響應慢

案例1:雪崩效應

-- 這條看似無害的查詢,差點讓整個系統(tǒng)崩潰
SELECT*FROMorders o
LEFTJOINusers uONo.user_id=u.id
WHEREo.created_at>='2024-01-01'
ANDu.status='active'
ORDERBYo.created_atDESC;

影響分析

? 執(zhí)行時間:2.3秒

? 并發(fā)情況下連接池迅速耗盡

? 導致其他正常查詢排隊等待

? 最終引發(fā)整站服務不可用

第一步:精準定位慢查詢

1.1 開啟慢查詢日志(生產環(huán)境安全配置)

-- 動態(tài)開啟,無需重啟MySQL
SETGLOBALslow_query_log='ON';
SETGLOBALslow_query_log_file='/var/log/mysql/slow.log';
SETGLOBALlong_query_time=1; -- 1秒以上記錄
SETGLOBALlog_queries_not_using_indexes='ON';

運維提醒:慢查詢日志會消耗額外IO,建議:

? 生產環(huán)境設置合理的long_query_time(通常1-2秒)

? 定期輪轉日志文件,避免磁盤空間不足

? 可配置log_slow_rate_limit控制記錄頻率

1.2 使用mysqldumpslow快速分析

# 按查詢時間排序,顯示TOP 10
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

# 按查詢次數(shù)排序,找出頻繁執(zhí)行的慢查詢
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

# 組合分析:按平均查詢時間排序
mysqldumpslow -s at -t 10 /var/log/mysql/slow.log

1.3 實時監(jiān)控慢查詢(推薦工具)

-- 查看當前正在執(zhí)行的慢查詢
SELECT
  id,
 user,
  host,
  db,
  command,
 time,
  state,
  info
FROMinformation_schema.processlist
WHEREcommand!='Sleep'
ANDtime>5
ORDERBYtimeDESC;

第二步:深度分析執(zhí)行計劃

2.1 EXPLAIN詳解與實戰(zhàn)技巧

-- 基礎EXPLAIN
EXPLAINSELECT*FROMordersWHEREuser_id=12345;

-- 更詳細的分析
EXPLAIN FORMAT=JSONSELECT*FROMordersWHEREuser_id=12345;

-- MySQL 8.0+推薦使用
EXPLAIN ANALYZESELECT*FROMordersWHEREuser_id=12345;

2.2 關鍵字段解讀(運維視角)

字段 危險值 優(yōu)化建議
type ALL, index 必須優(yōu)化,全表掃描
possible_keys NULL 缺少索引,立即創(chuàng)建
rows >10000 索引選擇性差,需重新設計
Extra Using filesort 避免ORDER BY無索引字段
Extra Using temporary 優(yōu)化GROUP BY和DISTINCT

2.3 實戰(zhàn)案例:復雜查詢優(yōu)化

原始查詢(執(zhí)行時間:1.2秒):

SELECT
  o.id, o.order_no, u.username, p.nameasproduct_name
FROMorders o
JOINusers uONo.user_id=u.id
JOINorder_items oiONo.id=oi.order_id
JOINproducts pONoi.product_id=p.id
WHEREo.created_atBETWEEN'2024-01-01'AND'2024-01-31'
ANDu.city='Shanghai'
ANDp.category_id=10
ORDERBYo.created_atDESC
LIMIT20;

EXPLAIN分析結果

+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra            |
+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
| 1 | SIMPLE   | o   | ALL | NULL     | NULL | NULL  | NULL | 50000 | Using where; Using filesort |
| 1 | SIMPLE   | u   | ALL | PRIMARY    | NULL | NULL  | NULL | 10000 | Using where; Using join buffer |
| 1 | SIMPLE   | oi  | ALL | NULL     | NULL | NULL  | NULL | 80000 | Using where; Using join buffer |
| 1 | SIMPLE   | p   | ALL | NULL     | NULL | NULL  | NULL | 5000 | Using where; Using join buffer |
+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+

問題分析

1. 所有表都是全表掃描(type=ALL)

2. 沒有合適的索引(key=NULL)

3. 使用了文件排序(Using filesort)

4. 估算掃描行數(shù):50000 × 10000 × 80000 × 5000 = 天文數(shù)字

第三步:索引優(yōu)化策略

3.1 單列索引優(yōu)化

-- 為經常用于WHERE條件的字段創(chuàng)建索引
CREATEINDEX idx_orders_created_atONorders(created_at);
CREATEINDEX idx_users_cityONusers(city);
CREATEINDEX idx_products_categoryONproducts(category_id);

-- 為外鍵創(chuàng)建索引(提升JOIN性能)
CREATEINDEX idx_orders_user_idONorders(user_id);
CREATEINDEX idx_order_items_order_idONorder_items(order_id);
CREATEINDEX idx_order_items_product_idONorder_items(product_id);

3.2 復合索引的藝術

復合索引設計原則

1.選擇性原則:高選擇性字段在前

2.查詢頻率原則:常用查詢條件在前

3.排序優(yōu)化原則:ORDER BY字段考慮加入索引

-- 優(yōu)化后的復合索引設計
CREATEINDEX idx_orders_date_userONorders(created_at, user_id);
CREATEINDEX idx_users_city_idONusers(city, id);
CREATEINDEX idx_products_cat_nameONproducts(category_id, name);

-- 覆蓋索引:避免回表查詢
CREATEINDEX idx_orders_coverONorders(user_id, created_at, id, order_no);

3.3 優(yōu)化后的查詢性能

重新執(zhí)行EXPLAIN分析:

+----+-------------+-------+-------+---------------------------+---------------------+---------+---------------+------+-----------------------+
| id | select_type | table | type | possible_keys       | key         | key_len | ref      | rows | Extra         |
+----+-------------+-------+-------+---------------------------+---------------------+---------+---------------+------+-----------------------+
| 1 | SIMPLE   | o   | range | idx_orders_date_user   | idx_orders_date_user| 8    | NULL     | 100 | Using where      |
| 1 | SIMPLE   | u   | eq_ref| PRIMARY,idx_users_city_id | PRIMARY       | 4    | o.user_id   | 1  | Using where      |
| 1 | SIMPLE   | oi  | ref  | idx_order_items_order_id | idx_order_items_order_id | 4 | o.id    | 2  |            |
| 1 | SIMPLE   | p   | eq_ref| PRIMARY,idx_products_cat_name | idx_products_cat_name | 8 | oi.product_id,const | 1 | Using where   |
+----+-------------+-------+-------+---------------------------+---------------------+---------+---------------+------+-----------------------+

優(yōu)化效果

? 執(zhí)行時間:1.2秒 → 15毫秒(提升80倍)

? 掃描行數(shù):40億+ → 204行(減少99.999995%)

? CPU使用率:從95%降至5%

第四步:高級優(yōu)化技巧

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

對于大數(shù)據(jù)量場景,考慮分區(qū)表:

-- 按月分區(qū)的訂單表
CREATE TABLEorders_partitioned (
  idbigintNOT NULLAUTO_INCREMENT,
  user_idintNOT NULL,
  order_novarchar(50)NOT NULL,
  created_at datetimeNOT NULL,
  amountdecimal(10,2)NOT NULL,
 PRIMARY KEY(id, created_at),
  INDEX idx_user_date (user_id, created_at)
)PARTITIONBYRANGE(YEAR(created_at)*100+MONTH(created_at)) (
 PARTITIONp202401VALUESLESS THAN (202402),
 PARTITIONp202402VALUESLESS THAN (202403),
 PARTITIONp202403VALUESLESS THAN (202404),
 -- ... 更多分區(qū)
 PARTITIONp202412VALUESLESS THAN (202501)
);

4.2 查詢重寫技巧

原查詢(低效):

SELECT*FROMorders
WHEREuser_idIN(
 SELECTidFROMusersWHEREcity='Shanghai'
);

優(yōu)化后(高效):

SELECTo.*FROMorders o
INNERJOINusers uONo.user_id=u.id
WHEREu.city='Shanghai';

4.3 索引維護最佳實踐

-- 定期分析索引使用情況
SELECT
  TABLE_SCHEMA,
  TABLE_NAME,
  INDEX_NAME,
  STAT_VALUEaspages_used
FROMinformation_schema.INNODB_SYS_TABLESTATS;

-- 找出未使用的索引
SELECT
  t.TABLE_SCHEMA,
  t.TABLE_NAME,
  t.INDEX_NAME
FROMinformation_schema.statistics t
LEFTJOINperformance_schema.table_io_waits_summary_by_index_usage p
 ONt.TABLE_SCHEMA=p.OBJECT_SCHEMA
 ANDt.TABLE_NAME=p.OBJECT_NAME
 ANDt.INDEX_NAME=p.INDEX_NAME
WHEREp.INDEX_NAMEISNULL
 ANDt.TABLE_SCHEMANOTIN('mysql','information_schema','performance_schema');

第五步:監(jiān)控與預警系統(tǒng)

5.1 關鍵監(jiān)控指標

-- 慢查詢統(tǒng)計
SHOWGLOBALSTATUSLIKE'Slow_queries';

-- 查詢緩存命中率
SHOWGLOBALSTATUSLIKE'Qcache%';

-- InnoDB緩沖池命中率
SHOWGLOBALSTATUSLIKE'Innodb_buffer_pool_read%';

5.2 自動化監(jiān)控腳本

#!/bin/bash
# mysql_slow_monitor.sh
# 慢查詢監(jiān)控腳本

MYSQL_USER="monitor"
MYSQL_PASS="your_password"
SLOW_LOG="/var/log/mysql/slow.log"
ALERT_THRESHOLD=10 # 慢查詢數(shù)量閾值

# 統(tǒng)計最近1小時的慢查詢數(shù)量
SLOW_COUNT=$(mysqldumpslow -t 999999$SLOW_LOG| grep"Time:"|wc-l)

if[$SLOW_COUNT-gt$ALERT_THRESHOLD];then
 echo"ALERT: 發(fā)現(xiàn)$SLOW_COUNT個慢查詢,超過閾值$ALERT_THRESHOLD"
 # 發(fā)送告警(集成釘釘、郵件等)
 # curl -X POST "釘釘webhook地址" -d "慢查詢告警..."
fi

實戰(zhàn)成果展示

優(yōu)化前后對比

指標 優(yōu)化前 優(yōu)化后 提升比例
平均響應時間 800ms 8ms 99%
QPS 200 2000+ 10倍
CPU使用率 95% 15% 84%
內存使用 8GB 4GB 50%
磁盤IO 300MB/s 50MB/s 83%

業(yè)務價值

?用戶體驗:頁面加載速度提升10倍

?成本節(jié)省:服務器資源使用減少50%

?穩(wěn)定性:系統(tǒng)故障率從每月3次降至0次

?團隊效率:運維響應時間減少80%

進階優(yōu)化建議

1. 讀寫分離架構

# 主從配置示例
master:
host:mysql-master
port:3306

slaves:
-host:mysql-slave1
 port:3306
 weight:50
-host:mysql-slave2
 port:3306
 weight:50

2. 連接池優(yōu)化

# HikariCP配置
hikari.maximum-pool-size=20
hikari.minimum-idle=5
hikari.connection-timeout=20000
hikari.idle-timeout=300000
hikari.max-lifetime=1200000

3. 緩存策略

// Redis緩存熱點數(shù)據(jù)
@Cacheable(value = "orders", key = "#userId + '_' + #date")
publicListgetOrdersByUserAndDate(Long userId, String date){
 returnorderMapper.selectByUserAndDate(userId, date);
}

常見誤區(qū)與避坑指南

誤區(qū)1:盲目添加索引

-- 錯誤:為每個字段都建索引
CREATEINDEX idx_col1ONtable1(col1);
CREATEINDEX idx_col2ONtable1(col2);
CREATEINDEX idx_col3ONtable1(col3);

-- 正確:根據(jù)查詢模式建復合索引
CREATEINDEX idx_combinedONtable1(col1, col2, col3);

誤區(qū)2:忽略索引維護成本

?INSERT性能影響:每個索引都會增加寫入成本

?存儲空間占用:索引通常占用20-30%的表空間

?內存消耗:InnoDB需要將索引加載到內存

誤區(qū)3:過度依賴EXPLAIN

EXPLAIN只是預估,實際性能需要結合:

? 真實數(shù)據(jù)量測試

? 并發(fā)壓力測試

? 生產環(huán)境監(jiān)控數(shù)據(jù)

總結:建立長效優(yōu)化機制

日常運維檢查清單

? 每周分析慢查詢日志

? 監(jiān)控索引使用情況

? 檢查表分區(qū)策略

? 評估查詢緩存效果

? 更新表統(tǒng)計信息

應急響應流程

1.發(fā)現(xiàn)慢查詢→ 立即分析EXPLAIN

2.確認影響范圍→ 評估業(yè)務風險

3.快速優(yōu)化→ 添加索引或查詢重寫

4.驗證效果→ 監(jiān)控關鍵指標

5.總結復盤→ 完善監(jiān)控預警

作為運維工程師,我們的目標不僅是解決當前問題,更要建立可持續(xù)的優(yōu)化體系。希望這套方法論能幫你構建高性能、穩(wěn)定可靠的MySQL環(huán)境。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)庫

    關注

    7

    文章

    3977

    瀏覽量

    67399
  • MySQL
    +關注

    關注

    1

    文章

    889

    瀏覽量

    28859

原文標題:MySQL慢查詢終極優(yōu)化指南:從0.8秒到8毫秒的性能飛躍實戰(zhàn)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    mysql的SELECT查詢使用方式

    mysql分組查詢
    發(fā)表于 04-03 09:18

    MySQL查詢的基本語法

    MySQL基本使用查詢
    發(fā)表于 05-09 09:13

    mysql查詢優(yōu)化

    mysql查詢優(yōu)化
    發(fā)表于 03-12 11:06

    MySQL優(yōu)化查詢性能優(yōu)化查詢優(yōu)化器的局限性與提示

    MySQL優(yōu)化三:查詢性能優(yōu)化查詢優(yōu)化器的局限性與提示
    發(fā)表于 06-02 06:34

    SQL查詢的原因分析總結

    sql 查詢的48個原因分析 1、沒有索引或者沒有用到索引(這是查詢最常見的問題,是程序設計的缺陷)。 2、I/O吞吐量小,形成了瓶頸效應。 3、沒有創(chuàng)建計算列導致
    發(fā)表于 03-08 11:58 ?0次下載

    詳解MySQL查詢優(yōu)化 MySQL邏輯架構分析

    說起MySQL查詢優(yōu)化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理創(chuàng)建索引、為字段選擇合適的數(shù)據(jù)類型..... 你是否真的理解這些優(yōu)化技巧?是否理
    的頭像 發(fā)表于 05-28 16:43 ?4723次閱讀
    詳解<b class='flag-5'>MySQL</b>的<b class='flag-5'>查詢</b><b class='flag-5'>優(yōu)化</b> <b class='flag-5'>MySQL</b>邏輯架構分析

    MySQL 基本知識點梳理和查詢優(yōu)化

    本文主要是總結了工作中一些常用的操作,以及不合理的操作,在對查詢進行優(yōu)化時收集的一些有用的資料和信息,適合有 MySQL 基礎的開發(fā)人員。
    的頭像 發(fā)表于 12-01 08:14 ?3485次閱讀

    MySQL查詢幫助的使用

    在使用MySQL過程中,當遇到操作語法、數(shù)據(jù)類型的取值范圍、功能是否支持等問題時,可以使用MySQL自帶的幫助文檔查詢。
    的頭像 發(fā)表于 04-16 17:14 ?1963次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>查詢</b>幫助的使用

    MySQL數(shù)據(jù)庫:理解MySQL的性能優(yōu)化優(yōu)化查詢

    最近一直在為大家更新MySQL相關學習內容,可能有朋友不懂MySQL的重要性。在程序,語言,架構更新?lián)Q代頻繁的今天,MySQL 恐怕是大家使用最多的存儲數(shù)據(jù)庫了。由于MySQL
    的頭像 發(fā)表于 07-02 17:18 ?3461次閱讀
    <b class='flag-5'>MySQL</b>數(shù)據(jù)庫:理解<b class='flag-5'>MySQL</b>的性能<b class='flag-5'>優(yōu)化</b>、<b class='flag-5'>優(yōu)化</b><b class='flag-5'>查詢</b>

    如何優(yōu)化MySQL百萬數(shù)據(jù)的深分頁問題

    我們日常做分頁需求時,一般會用limit實現(xiàn),但是當偏移量特別大的時候,查詢效率就變得低下。本文將分四個方案,討論如何優(yōu)化MySQL百萬數(shù)據(jù)的深分頁問題,并附上最近優(yōu)化生產
    的頭像 發(fā)表于 04-06 15:12 ?2283次閱讀

    你會從哪些維度進行MySQL性能優(yōu)化?1

    你會從哪些維度進行MySQL性能優(yōu)化?你會怎么回答? 所謂的性能優(yōu)化,一般針對的是MySQL查詢
    的頭像 發(fā)表于 03-03 10:23 ?844次閱讀
    你會從哪些維度進行<b class='flag-5'>MySQL</b>性能<b class='flag-5'>優(yōu)化</b>?1

    你會從哪些維度進行MySQL性能優(yōu)化?2

    你會從哪些維度進行MySQL性能優(yōu)化?你會怎么回答? 所謂的性能優(yōu)化,一般針對的是MySQL查詢
    的頭像 發(fā)表于 03-03 10:23 ?799次閱讀
    你會從哪些維度進行<b class='flag-5'>MySQL</b>性能<b class='flag-5'>優(yōu)化</b>?2

    查詢SQL在mysql內部是如何執(zhí)行?

    我們知道在mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句在 MySQL 內部到底是如何執(zhí)行的呢?本文跟大家探討一
    的頭像 發(fā)表于 01-22 14:53 ?1023次閱讀
    <b class='flag-5'>查詢</b>SQL在<b class='flag-5'>mysql</b>內部是如何執(zhí)行?

    MySQL查詢優(yōu)化案例

    凌晨3點,手機瘋狂震動。監(jiān)控告警顯示:核心業(yè)務接口響應時間超過20秒,用戶投訴如潮水般涌來。這是每個運維工程師的噩夢時刻。
    的頭像 發(fā)表于 08-27 14:49 ?368次閱讀

    數(shù)據(jù)庫查詢分析與SQL優(yōu)化實戰(zhàn)技巧

    今天,我將分享我在處理數(shù)千次數(shù)據(jù)庫性能問題中積累的實戰(zhàn)經驗,幫助你系統(tǒng)掌握查詢分析與SQL優(yōu)化的核心技巧。無論你是剛入門的運維新手,還是有一定經驗的工程師,這篇文章都將為你提供實用的解決方案。
    的頭像 發(fā)表于 09-08 09:34 ?378次閱讀