我觉得索引失效只有两种情况
● 一种是,无法使用索引,用不上索引
● 还有一种是,没必要走索引,直接全表扫描(Type = All),把主键索引的叶子节点全部走一遍的效率(全表扫描),比走二级索引,然后再回表的效率高。
● 比如说,范围查询占比太大,超过了全表的30%(这里并不准确),官网是这么说的: a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size.优化器就会放弃使用索引,选择进行全表扫描。
● 任何查询走不走所谓的索引都是看成本,毕竟我们的目的就是尽可能快的查询数据。怎么快,怎么来。
具体有哪些索引失效的场景?
● like “%xx” "%xx%”,这种左模糊查询或者左右模糊查询,就可能导致索引失效,当然也可能走索引,比如正好可以使用索引覆盖。
● a = x or b = y,or 前后只要有一个字段不是索引字段,就会导致索引失效,如果两个字段都是索引字段,那么会走索引,这种情况就是索引合并。
● 对索引列进行计算,或者使用函数,那么也会导致索引失效。
● 这里提一下,MySQL在遇到字符串和数字的比较,会自动将字符串转换成数字,然后再进行比较
● 对索引列进行隐式类型转换,比如索引字段是varchar类型的,你查询的时候输入的字段参数是整数类型的话,这里就会对字段进行类型转换,导致索引失效。
● 使用联合索引的时候,不符合最左前缀原则,就可能导致索引失效,当然也可能走索引,比如正好可以使用索引覆盖。
● null:is null、is not null ;索引本身不对null值的数据做处理。理论上不要让字段为null,处理方法:建表的时候,字段强制不为null、字段设置默认值。文章来源地址https://www.toymoban.com/news/detail-454318.html
文章来源:https://www.toymoban.com/news/detail-454318.html
到了这里,关于索引什么场景下会失效?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!