【视频笔记】线上事务-mysql索引失效解析

mysql数据库,存储引擎innodb,如下sql

select count(*) from orders where DATE(created_at) = '2025-01-01';

created_at是建立了索引的,正常情况是希望走索引的

 问题是这里用了date函数,导致innodb不能走created_at建立的索引树了,此时索引就失效了

不光这个date函数,mysql的函数都会使索引失效

 原因是innodb是使用b+tree来实现的,b+tree都是排序好的数据,函数计算之后的结果,不是这个排序了,只能一个一个去比较了,所以索引失效了,进行了全表的扫描

修改:

select count(*) from orders where created_at >= '2025-01-01' and created_at <= '2025-01-01'

除了函数,还有一些隐式的类型转换,底层也会调用这个函数,也是不会走索引

如:select * from users where phone = 123456; (phone 是 varchar) 而传入的是数字类型,那此时就会调用cast,来转换为字符串。

所以索引使用的时候,记得数据类型一定要保持一致,否则索引还是会失效

索引使用的规则

 索引失效的场景

 

参考:线上事务-mysql索引失效解析_哔哩哔哩_bilibili

posted @ 2025-06-12 21:02  fanblog  阅读(10)  评论(0)    收藏  举报