老师,'!=' 不是不会用到索引吗?那有什么好的解决办法吗?
来源:10-2 课程回顾及展望-续

ericdemon
2019-11-12
今天在业务上碰到一个需求是过滤project_status
后且show
要不为0的数据
一开始想到的逻辑很复杂,但是后面还是尝试使用 ’!=‘ 来实现,但发现为什么我可以用到索引 ?
-
索引是联合索引
project_status
,show
,project_type
-
当我先过滤
project_status
的时候发现扫描的是57行 -
当我开始加上 != 条件的时候发现,扫描的只有4行了
-
在这里我想到的是索引的最左前缀原则,还是影响到了,但是 != 不是不会使用索引的吗?于是我又将其他列做了一次 != 过滤
-
结果的确是扫描了57行,就是
project_status
扫描的行数,其实这里很不严谨,因为一条sql只能用一个索引,所以account_id
这一列本身就不会用到索引,但是主要的疑惑点是 为什么联合索引的时候,!=
的条件仍然能用到索引呢?
老师,今天这个我感觉蛮有趣的,但是我就是有点不明白。。到底是怎么一个回事呢
写回答
1回答
-
sqlercn
2019-11-13
这里就是只用到了联合索引中的某一个字段,你看key_len的长度为1,也就是说只用到了联合索引中的status这一列。
022019-11-13
相似问题