在 MySQL 數據庫優化中,索引雖然是提升查詢性能的關鍵手段,但若使用不當,反而可能拖慢查詢速度。本文通過一個具體的測試案例,演示單列索引在特定場景下導致性能下降的現象,並說明正確的索引策略。
測試表 tuangou 包含 5000 條記錄,字段結構如下:
id | web | city | type
1 | 拉手網 | 北京 | 餐飲美食
2 | 拉手網 | 上海 | 休閒娛樂
3 | 百分團 | 天津 | 餐飲美食
... (共 5000 條)
5000 | 拉手網 | 西安 | 優惠卷票
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='拉手網' 的記錄,假設該值出現頻率較高,索引掃描返回的行數仍然很多city 字段進行二次過濾,產生額外的 I/O 開銷為經常聯合出現在 WHERE 條件中的字段建立聯合索引,而非單獨建立單列索引。場景 (3) 證明,(web, city) 聯合索引將查詢時間降低至 0.0007 秒,提升近 10 倍。
核心原則:索引設計應基於實際查詢模式,避免盲目為單一字段加索引;多條件查詢優先考慮聯合索引,並遵循「最左前綴」原則。