什麼我的索引居然失效了

我的索引居然失效了

​ 很多時候sql慢是因爲不合適的sql寫法導致了索引失效從而影響了sql的執行速度。

查詢條件中包含or

​ 首先爲了測試創建一個user表以及建一個普通索引UserId如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `age` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 執行一條sql是會走索引的:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-63xMTf7y-1592641908140)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200620155733.png)]

  • 把 ro條件+沒有索引的age加上就會不走索引:

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Kv3Tyfcx-1592641908144)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200620155821.png)]

分析以及結論

  • 對於or+沒有索引的age這種,假設走了userId的索引但是走到age查詢條件的時候,還是需要全表進行掃描
  • 所以還不如一開始就直接全表掃描一遍完事。

如果or的條件也加了索引,就會走索引。

如果字段類型是字符串,where時一定要用“”

  • 當字段時字符串類型的時候,是B+樹索引,如果查詢條件穿了一個數字過去,是字符串和數字進行比較,mysql會做隱式的類型轉化,把他們轉化爲浮點數再進行比較

like通配符可能導致索引失效

  • 並不是使用like就會導致索引失效,而是like查詢以%開頭會導致索引失效
    • 可以使用覆蓋索引進行優化
    • 把%放到後面

聯合索引,查詢時的條件列不是聯合索引中的第一個列,索引失效。

  • 當我們創建聯合索引的時候如(k1.k2.k3)相當於創建了(k1),(k1,k2)和(k1,k2,k3)三個索引,這就是最左匹配原則
  • 聯合索引不滿足最左原則,索引一般會失效,但這個mysql的優化器還有關係

在索引列上使用mysql的內置函數索引會失效

對索引列運算索引失效

在索引字段上使用(! = 或者<>,not in)時可能會導致索引失效

在索引字段上使用is null,is not null可能會導致索引失效

左連接查詢或者右連接查詢查詢關聯的字段編碼格式不一樣,可能導致索引失效。

mysql估計使用全表掃描要比使用索引快,則不使用索引。

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