老师,'!=' 不是不会用到索引吗?那有什么好的解决办法吗?

来源:10-2 课程回顾及展望-续

ericdemon

2019-11-12

今天在业务上碰到一个需求是过滤project_status后且show要不为0的数据

一开始想到的逻辑很复杂,但是后面还是尝试使用 ’!=‘ 来实现,但发现为什么我可以用到索引 ?

  1. 索引是联合索引 project_status , show , project_type

  2. 当我先过滤project_status的时候发现扫描的是57行
    图片描述

  3. 当我开始加上 != 条件的时候发现,扫描的只有4行了图片描述

  4. 在这里我想到的是索引的最左前缀原则,还是影响到了,但是 != 不是不会使用索引的吗?于是我又将其他列做了一次 != 过滤
    图片描述

  5. 结果的确是扫描了57行,就是project_status扫描的行数,其实这里很不严谨,因为一条sql只能用一个索引,所以account_id这一列本身就不会用到索引,但是主要的疑惑点是 为什么联合索引的时候,!= 的条件仍然能用到索引呢?

老师,今天这个我感觉蛮有趣的,但是我就是有点不明白。。到底是怎么一个回事呢

写回答

1回答

sqlercn

2019-11-13

这里就是只用到了联合索引中的某一个字段,你看key_len的长度为1,也就是说只用到了联合索引中的status这一列。

0
2
sqlercn
回复
ericdemon
rows 是存储引擎返回给MySQL服务层的数据预估行数,其它的过滤条件是由MySQL服务器层在内存中进行过滤后返回的。
2019-11-13
共2条回复

零基础入门 详解企业主流数据库MySQL8.0

掌握SQL优化与慢查询优化,具备独当一面的能力

1641 学习 · 485 问题

查看课程