1. 程式人生 > 其它 >MYSQL索引使用注意事項

MYSQL索引使用注意事項

1. 索引列不要使用函式和運算

2. 儘量避免使用 != not in<> 等否定操作符

3.當查詢條件為多個的時候,可以採用複合索引

4.範圍查詢對多列查詢的影響

查詢中的某個列有範圍查詢,則其右邊所有列都無法使用索引優化查詢。

舉個例子,假設有一個場景需要查詢本週釋出的資訊文章,其中的條件是必須是啟用狀態,且釋出時間在這周內。那麼,SQL 語句可以寫成:

select * from news where publish_time >='2017-01-02' and publish_time <='2017-01-08' and enable=1

這種情況下,因為範圍查詢對多列查詢的影響,將導致

news_publish_idx(publish_time, enable) 索引中 publish_time 右邊所有列都無法使用索引優化查詢。換句話說,news_publish_idx(publish_time, enable) 索引等價於 news_publish_idx(publish_time)

對於這種情況,我的建議:對於範圍查詢,務必要注意它帶來的副作用,並且儘量少用範圍查詢,可以通過曲線救國的方式滿足業務場景。

5.遵循最左匹配原則

複合索引遵守“最左字首”原則,即在查詢條件中使用了複合索引的第一個欄位,索引才會被使用。因此,在複合索引中索引列的順序至關重要。如果不是按照索引的最左列開始查詢,則無法使用索引。

6.索引列不會包含NULL

7.儘量避免使用 or 來連線條件

8.隱式轉換的影響

當查詢條件左右兩側型別不匹配的時候會發生隱式轉換,隱式轉換帶來的影響就是可能導致索引失效而進行全表掃描。下面的案例中,date_str 是字串,然而匹配的是整數型別,從而發生隱式轉換。

select*fromnewswheredate_str =201701

9.like 語句的索引失效問題

like 的方式進行查詢,在 like "value%" 可以使用索引,但是對於 like "%value%" 這樣的方式,執行全表查詢,這在資料量小的表,不存在效能問題,但是對於海量資料,全表掃描是非常可怕的事情。所以,根據業務需求,考慮使用