Mysql:索引失效的幾種可能原因

最近閒來無事,發現自己mysql的知識點忘得差不多了,打算重新拾起來捯飭捯飭,個人覺得其中最重要的知識點還是mysql的優化問題,畢竟mysql使用方面都是很簡單的東西,打算從索引方面開始學習吧。

 

有時候我們會發現,明明已經建立了索引,但是通過explain發現語句並沒有使用上索引,那咱們可能踩中了以下的幾種情況:

 

索引失效的案例:

1、如果條件中有or,即使其中有部分條件帶索引也不會使用(這也是爲什麼儘量少用or的原因)

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。

 

2、對於多列索引,不是包含第一部分,則不會使用索引。

例:建立組合索引 a,b,c   其中a ab  abc ac都可以用到索引,還有就是順序可以隨意。(我自己實踐過,只要有a在就行,好像在某個版本之後,順序不是abc時mysql索引優化器會自動優化)

 

3、like查詢是以%開頭,不會使用索引。

 

4、存在索引列的數據類型隱形轉換,則用不上索引,比如列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引

例:user_name字段爲字符類型,但是如果不加引號,則不會使用索引。

 

5、where 子句裏對索引列上有數學運算或者函數,會導致索引失效而轉向全表掃描

例:在索引列上做計算相加,索引失效。

例:在索引列上使用函數,索引失效。

 

什麼情況下不推薦使用索引?

1、數據唯一性差的字段不要使用索引。(例如:性別只有兩種可能數據。意味着索引的二叉樹級別少,多是平級。這樣的二叉樹查找無異於全表掃描)

2、頻繁更新的字段不要使用索引。(比如logincount登錄次數,頻繁變化導致索引也頻繁變化,增大數據庫工作量,降低效率。)

3、字段不在where語句出現時不要添加索引,如果where後含IS NULL /IS NOT NULL/ like ‘%輸入符%’等條件,不建議使用索引。

4、儘量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select * 這種全字段查詢(會增大數據庫壓力和io開銷)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章