前置知识:了解下b+树的数据结构。很多索引失效的原因就会恍然大悟 推荐文章:juejin.cn/post/708106… (我啥时候能写出来这么高质量文章!!!!)
全值匹配
当我们使用多条件查询时候,尽量把相关联的索引字段全部使用在条件中。注意联合索引中的 最左前缀匹配
最左前缀匹配
如果你了解了b+树的数据结构,你就会很容易理解这个规则。如果是有这样一个 age+num (年纪+学号)组合索引。如果跳过了age 而使用学号做一个大于或者小于的查询。还有啥意义?num排好序的前提是前一个索引字段age排好后才能轮到num。 like的前置%是不是理解了?
like 的前置%
遵循最左前缀匹配原则,前置%会破坏索引的有序性,从而走全表扫描。
不在索引列上做任何操作(计算、函数、(自动or手动)类型转换)
在索引字段上做任何操作,都有可能引发索引失效,从而导致全表所描。比如说,所有的数据都按照名字的英文字母排好序了,你使用了字段截取或者进行了拼接,那就会破坏掉现有的排序。
尽量使用覆盖索引
减少 select * 语句,尽量在索引列上返回数据,能够有效的减少回表的次数。
字符串的隐式转换
字符串不加引号,导致索引失效
范围查询有可能导致索引失效
mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描 < 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
null条件查询
is null,is not null 一般情况下也无法使用索引。 [问题:mysql 是如何存放null值的普通字段与索引字段?]
or或in的使用
少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引,详见范围查询优化