Mysql中哪些場景下會導致使用了索引但索引失效,導致性能變差?

一葉知秋丿


以 Mysql 為例,其中索引 BTree 類型 。以下幾種SQL設計會導致雖然使用了索引,但是索引不會生效,即引擎放棄使用索引而進行全表掃描:


  • WHERE 子句中使用 != 或 <> 操作符。
  • WHERE 子句中對索引列使用 %前綴模糊查詢。
  • WHERE 子句中對索引列使用 OR 來連接條件。
  • WHERE 子句中對索引列使用 NOT IN。
  • WHERE 子句中對索引列使用計算、函數、類型轉換等操作。
  • WHERE 子句中對索引列使用參數。

軟件測試開發技術棧


以下情況,MySQL的索引"失效"不可用

1、通過索引掃描的記錄超過20%~30%,可能會變成全表掃描

2、聯合索引中,查詢條件不符合左側前導要求

3、查詢條件列最左以通配符%開始

4、查詢條件發生數據類型隱式轉換,或者字符集不匹配

5、HEAP表使用HASH索引時,使用範圍檢索或者ORDER BY

6、多表關聯時,排序字段不屬於驅動表,無法利用索引完成排序

7、JOIN查詢時,關聯列數據類型(字符集)不一致也會導致索引不可用

8、不可見索引,即便force index也不可用9、違反索引排序規則


分享到:


相關文章: