Mysql索引失效的几种情况及失效原理

使用复合索引时(聚合索引)

因为Innodb引擎索引的底层使用B+Tree来实现,只有叶子节点才存储数据,而非叶子节点只存储索引,当使用复合索引时,会根据创建索引时字段的先后顺序来规定排序时的优先级。也就是说只有前面的字段相等时,后面的字段才有序。

复合索引失效

1.不满足最佳左前缀匹配法则且不是索引覆盖的情况。
所谓索引覆盖就是指要查询的字段就是复合索引的一部分。Innodb中存在聚集索引,聚集索引的选取规则为:如果有一个主键,则这个主键就是聚集索引。如果有两个主键则,创建主键时排在前面的字段当作聚集索引。如果没有主键则用第一个非空唯一字段作为聚集索引。如果都没有的话,则隐示创建一个字段作为聚集索引。之所以叫聚集索引是因为,在聚集索引的B+Tree的叶子节点中拥有每条数据的所有字段。因此如果使用聚集索引进行搜索的话,不管要查询什么字段都会使用到聚集索引。非聚集索引的B+Tree的子结点中只有复合索引字段和聚集索引。因此用普通索引查询,实际上最后需要回表(如果不是索引覆盖的话)。
2.范围查询后面的字段索引失效
这个就和节点中是前面的字段优先排序有关。当前面某个字段处于某个范围时,后面的字段实际上是无须的,无须自然就不能用索引了。
3.!=
实际上!=不一定会导致索引失效,只有非首个字段!=时才会导致这个字段及之后的字段索引失效

字符串

1.like失效
当使用like时,%不能放在首部,这个同上,也是因为排序规则,一个单列字符串索引就相当于多个char的复合索引嘛。
2.=失效
这个就比较奇怪了,当你的字符串不加引号时,索引是会失效的,因为他会进行自动类型转换,而这个就会导致索引失效。

单列索引

1.索引列不能是表达式的一部分,也不能是函数的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值