我的索引居然失效了
很多時候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的優化器還有關係