首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 索引使用不當導致查詢速度比無索引更慢的實測分析

     編輯:MySQL 資料庫相關知識

在 MySQL 數據庫優化中,索引雖然是提升查詢性能的關鍵手段,但若使用不當,反而可能拖慢查詢速度。本文通過一個具體的測試案例,演示單列索引在特定場景下導致性能下降的現象,並說明正確的索引策略。

測試環境與數據準備

測試表 tuangou 包含 5000 條記錄,字段結構如下:

id | web      | city    | type
1  | 拉手網   | 北京    | 餐飲美食
2  | 拉手網   | 上海    | 休閒娛樂
3  | 百分團   | 天津    | 餐飲美食
... (共 5000 條)
5000 | 拉手網 | 西安    | 優惠卷票

測試 SQL 語句

SELECT * FROM tuangou WHERE web='拉手網' AND city='上海';

三種場景的執行時間對比

場景索引狀態執行時間
(1)無索引0.0041 秒
(2)僅給 web 字段加索引0.0064 秒
(3)web 和 city 字段均加索引(聯合索引)0.0007 秒

現象分析

場景 (2) 中,雖然為 web 字段建立了索引,但查詢時間(0.0064 秒)反而比全表掃描(0.0041 秒)更慢。原因在於:

  • 單列索引只能過濾 web='拉手網' 的記錄,假設該值出現頻率較高,索引掃描返回的行數仍然很多
  • MySQL 需要回表查詢 city 字段進行二次過濾,產生額外的 I/O 開銷
  • 優化器可能誤判索引代價,導致執行計劃不優

最佳實踐建議

為經常聯合出現在 WHERE 條件中的字段建立聯合索引,而非單獨建立單列索引。場景 (3) 證明,(web, city) 聯合索引將查詢時間降低至 0.0007 秒,提升近 10 倍。

核心原則:索引設計應基於實際查詢模式,避免盲目為單一字段加索引;多條件查詢優先考慮聯合索引,並遵循「最左前綴」原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved