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

MySQL查詢性能慢時(shí)索引失效的排查與優(yōu)化實(shí)踐

 更新時(shí)間:2025年08月17日 10:08:26   作者:淺沫云歸  
在高并發(fā)和大數(shù)據(jù)量的生產(chǎn)環(huán)境中,MySQL的查詢性能至關(guān)重要,本文將圍繞索引失效這一常見問題展開,帶你深入排查并徹底解決索引失效引發(fā)的性能瓶頸

在高并發(fā)和大數(shù)據(jù)量的生產(chǎn)環(huán)境中,MySQL的查詢性能至關(guān)重要。本文圍繞“索引失效”這一常見問題展開,結(jié)合真實(shí)業(yè)務(wù)場(chǎng)景,從問題現(xiàn)象、定位過程、根因分析、優(yōu)化改進(jìn)到預(yù)防監(jiān)控,帶你深入排查并徹底解決索引失效引發(fā)的性能瓶頸。

一、問題現(xiàn)象描述

  • 響應(yīng)時(shí)間突增:某關(guān)鍵查詢的平均響應(yīng)時(shí)間由 < 50ms 突然飆升至 500ms~2s。
  • 連接數(shù)激增:慢查詢堆積導(dǎo)致數(shù)據(jù)庫連接數(shù)持續(xù)上升,甚至出現(xiàn)連接超時(shí)。
  • CPU/IO突然飆高:結(jié)合監(jiān)控,發(fā)現(xiàn) MySQL 進(jìn)程的 CPU 利用率或 IO 等待明顯提升。
  • 業(yè)務(wù)鏈路阻塞:依賴該查詢的請(qǐng)求出現(xiàn)排隊(duì),業(yè)務(wù)整體吞吐下降。

這些都是典型的索引失效引起的性能下降現(xiàn)象。

二、問題定位過程

1. 開啟慢查詢?nèi)罩?/h3>

my.cnf 中配置:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1    # 記錄超過1秒的查詢
log_queries_not_using_indexes = 1   # 記錄未使用索引的查詢

重啟后,復(fù)現(xiàn)業(yè)務(wù),收集慢查詢?nèi)罩尽?/p>

2. 使用EXPLAIN分析執(zhí)行計(jì)劃

EXPLAIN FORMAT=JSON
SELECT *
FROM orders
WHERE user_id = 123 AND status = 'PENDING';

通過輸出,重點(diǎn)關(guān)注:

  • "type" 字段:ALL/NOSCAN 表示全表掃描或索引失效。
  • "key" 字段:顯示實(shí)際使用的索引;NULL 表示未使用索引。
  • "rows":掃描行數(shù)巨大時(shí)往往意味著全表掃描。

3. 監(jiān)控視圖查詢

-- 當(dāng)前正在執(zhí)行的查詢及其狀態(tài)
SELECT * FROM information_schema.PROCESSLIST
WHERE COMMAND = 'Query';

-- 索引統(tǒng)計(jì)信息
SHOW INDEX FROM orders;

通過上述步驟,可以快速定位哪些 SQL 未走索引或全表掃描。

三、根因分析與解決

場(chǎng)景1:范圍查詢導(dǎo)致索引失效

SELECT * FROM orders
WHERE user_id = 123
  AND created_at > '2023-01-01';

如果在 (user_id, created_at) 的聯(lián)合索引上,MySQL 可以使用前綴索引;但

WHERE created_at > '2023-01-01'
  AND user_id = 123;

順序顛倒可能導(dǎo)致只命中 created_at 單列索引,或在某些版本下索引失效。

解決:保證 WHERE 中字段順序與索引列順序一致;必要時(shí)拆分查詢。

場(chǎng)景2:前綴模糊匹配

WHERE username LIKE '%john%'

以上寫法無法利用 B-tree 索引。

解決:使用倒排索引(如 Elasticsearch),或避免前綴通配符,改為 john%

場(chǎng)景3:函數(shù)/隱式類型轉(zhuǎn)換

WHERE DATE(created_at) = '2023-07-10'

DATE() 會(huì)對(duì) created_at 列做全表函數(shù)掃描。

解決:使用范圍查詢:

WHERE created_at >= '2023-07-10 00:00:00'
  AND created_at < '2023-07-11 00:00:00'

或?yàn)?DATE(created_at) 創(chuàng)建函數(shù)索引(MySQL 8.0+)。

場(chǎng)景4:列順序與索引不匹配

對(duì)于復(fù)合索引 (a,b,c),查詢只使用了 (c,b) 的順序,會(huì)導(dǎo)致索引失效。

解決:根據(jù)實(shí)際查詢場(chǎng)景拆分或重建索引,保證常用查詢字段順序一致。

場(chǎng)景5:數(shù)據(jù)傾斜與索引選擇不當(dāng)

當(dāng) status 取值極度不均衡(如 99% 為 'DONE'),WHERE status='DONE' 雖有索引,但效果不顯著。執(zhí)行計(jì)劃可能選擇全表掃描。

解決:考慮字段基數(shù),避免為高度傾斜字段單獨(dú)建立索引,或使用覆蓋索引(覆蓋查詢所需字段)。

四、優(yōu)化改進(jìn)措施

1.合理拆分索引與覆蓋索引

對(duì)于頻繁查詢字段,創(chuàng)建覆蓋索引,例如:

CREATE INDEX idx_user_status ON orders(user_id, status, created_at);

EXPLAIN 時(shí)看到 Using index condition 則說明走了覆蓋索引,無需回表。

2.建立監(jiān)控告警

  • 結(jié)合 pt-query-digest 定期分析慢查詢?nèi)罩尽?/li>
  • 利用 PMM(Percona Monitoring and Management)監(jiān)控索引使用率和查詢吞吐。

3.定期整理/重建索引

大表可使用在線 DDL:

ALTER TABLE orders
  DROP INDEX idx_old,
  ADD INDEX idx_new(user_id, status, created_at)
  LOCK=NONE;

避免索引碎片。

4.查詢參數(shù)化和預(yù)編譯

使用 PreparedStatement 避免 SQL 拼接導(dǎo)致執(zhí)行計(jì)劃不命中緩存。

5.歸檔與分表分庫

  • 對(duì)歷史冷數(shù)據(jù)做歸檔操作,減小單表大小。
  • 對(duì)業(yè)務(wù)熱點(diǎn)分庫分表,進(jìn)一步提升查詢性能。

五、預(yù)防措施與監(jiān)控

1.建立 SQL 規(guī)范審查機(jī)制

新增或改動(dòng) SQL 前進(jìn)行 EXPLAIN 審核。

2.自動(dòng)化測(cè)試

在 CI/CD 流程中加入慢查詢聯(lián)調(diào)檢測(cè),對(duì)索引失效提前報(bào)警。

3.定期培訓(xùn)與分享

建立經(jīng)驗(yàn)分享白皮書,宣貫索引原理與查詢優(yōu)化。

4.健康檢查腳本

周期執(zhí)行腳本,統(tǒng)計(jì)未使用的索引、低效索引和高瓶頸 SQL。

通過以上系統(tǒng)化的索引失效排查與優(yōu)化方案,能夠幫助后端開發(fā)者在生產(chǎn)環(huán)境中快速發(fā)現(xiàn)性能瓶頸,精準(zhǔn)定位根因并實(shí)施改進(jìn),最終保障 MySQL 查詢的高效可靠。

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

相關(guān)文章

  • RedHat6.5安裝MySQL5.7教程詳解

    RedHat6.5安裝MySQL5.7教程詳解

    這篇文章主要為大家詳細(xì)介紹了RedHat6.5下MySQL5.7的安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 通過ibd文件恢復(fù)MySql數(shù)據(jù)的操作方法

    通過ibd文件恢復(fù)MySql數(shù)據(jù)的操作方法

    文章介紹通過.ibd文件恢復(fù)MySQL數(shù)據(jù)的過程,包括知道表結(jié)構(gòu)和不知道表結(jié)構(gòu)兩種情況,對(duì)于知道表結(jié)構(gòu)的情況,可以直接將.ibd文件復(fù)制到新的數(shù)據(jù)庫目錄并重啟MySQL,對(duì)于不知道表結(jié)構(gòu)的情況,可以使用ibd2sql工具生成對(duì)應(yīng)的SQL腳本,然后執(zhí)行該腳本恢復(fù)數(shù)據(jù),感興趣的朋友看看吧
    2025-03-03
  • MySQL的存儲(chǔ)函數(shù)與存儲(chǔ)過程相關(guān)概念與具體實(shí)例詳解

    MySQL的存儲(chǔ)函數(shù)與存儲(chǔ)過程相關(guān)概念與具體實(shí)例詳解

    MySQL存儲(chǔ)函數(shù)(自定義函數(shù)),函數(shù)一般用于計(jì)算和返回一個(gè)值,可以將經(jīng)常需要使用的計(jì)算或功能寫成一個(gè)函數(shù),存儲(chǔ)函數(shù)和存儲(chǔ)過程一樣,都是在數(shù)據(jù)庫中定義一些SQL語句的集合
    2023-03-03
  • SQL-?join多表關(guān)聯(lián)問題

    SQL-?join多表關(guān)聯(lián)問題

    這篇文章主要介紹了SQL-?join多表關(guān)聯(lián)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • MyBatis 動(dòng)態(tài)SQL全面詳解

    MyBatis 動(dòng)態(tài)SQL全面詳解

    MyBatis 的強(qiáng)大特性之一便是它的動(dòng)態(tài) SQL。如果你有使用 JDBC 或其他類似框架的經(jīng)驗(yàn),你就能體會(huì)到根據(jù)不同條件拼接 SQL 語句有多么痛苦。拼接的時(shí)候要確保不能忘了必要的空格,還要注意省掉列名列表最后的逗號(hào)。利用動(dòng)態(tài) SQL 這一特性可以徹底擺脫這種痛苦
    2021-09-09
  • MySQL三大日志(binlog、redo?log和undo?log)圖文詳解

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

    日志是MySQL數(shù)據(jù)庫的重要組成部分,記錄著數(shù)據(jù)庫運(yùn)行期間各種狀態(tài)信息,下面這篇文章主要給大家介紹了關(guān)于MySQL三大日志(binlog、redo?log和undo?log)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • MySql 8.0.11 安裝過程及 Navicat 鏈接時(shí)遇到的問題小結(jié)

    MySql 8.0.11 安裝過程及 Navicat 鏈接時(shí)遇到的問題小結(jié)

    這篇文章主要介紹了MySql 8.0.11 安裝過程及 Navicat 鏈接時(shí)遇到的問題,需要的朋友可以參考下
    2018-06-06
  • MySQL數(shù)據(jù)庫創(chuàng)建新用戶及授予權(quán)限的完整流程

    MySQL數(shù)據(jù)庫創(chuàng)建新用戶及授予權(quán)限的完整流程

    這篇文章主要給大家介紹了MySQL數(shù)據(jù)庫創(chuàng)建新用戶及授予權(quán)限的完整流程,通過這些步驟,管理員可以有效管理數(shù)據(jù)庫用戶,確保數(shù)據(jù)庫的安全性和高效運(yùn)行,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • MySQL中CURRENT_TIMESTAMP的使用方式

    MySQL中CURRENT_TIMESTAMP的使用方式

    這篇文章主要介紹了MySQL中CURRENT_TIMESTAMP的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • MySQL8.4實(shí)現(xiàn)RPM部署指南

    MySQL8.4實(shí)現(xiàn)RPM部署指南

    MySQL8.4是一個(gè)穩(wěn)定和高性能的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),本文主要介紹了MySQL8.4實(shí)現(xiàn)RPM部署指南,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06

最新評(píng)論

宽城| 武山县| 永州市| 长顺县| 新余市| 渝北区| 兰州市| 阿拉尔市| 道真| 镇沅| 新源县| 迁安市| 大田县| 沈丘县| 泸定县| 太康县| 乌鲁木齐市| 吉木乃县| 天气| 奉节县| 周宁县| 顺义区| 德格县| 淮滨县| 杨浦区| 榆中县| 法库县| 富源县| 木兰县| 武胜县| 合肥市| 怀化市| 子长县| 图们市| 南澳县| 祥云县| 三江| 绥中县| 肇源县| 贵港市| 酉阳|