什么情況下索引會失效?
- 違反最左前綴原則
- 范圍查詢右邊的列不能使用索引
- 不要在索引列上進行運算操作
- 字符串不加單引號導致索引失效
- 以%開頭的like模糊查詢
什么情況下索引會失效?
示例,有user表如下
CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '技術主鍵',`name` varchar(100) DEFAULT NULL COMMENT '姓名',`vip` varchar(2) DEFAULT NULL COMMENT 'vip等級',`tel` varchar(50) DEFAULT NULL COMMENT '電話',PRIMARY KEY (`id`),KEY `idx_1` (`name`) USING BTREE,KEY `idx_2` (`vip`,`tel`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用戶表';
1、違反最左前綴原則
如果是復合索引,要遵守最左前綴原則,指的是查詢從索引的最左前列開始,且不跳過索引中的列,匹配最左前綴走索引。
如下,復合索引idx_2(vip,tel),它最多的前綴有兩個:vip、vip tel。
那如果,有索引idx(col1,col2,col3),那么它最多的前綴有三個:col1、col1 col2、col1 col2 col3。
正例
反例
2、范圍查詢右邊的列不能使用索引
3、不要在索引列上進行運算操作
4、字符串不加單引號導致索引失效
字符串沒加單引號,MySQL的查詢優化器會自動進行“類型轉換”,導致索引失效。
正例:
反例:
5、以%開頭的like模糊查詢
如果僅僅是尾部模糊匹配('137%'),索引不會失效,如果是頭部模糊匹配('%137'),索引會失效。
正例:
反例: