MySQL含a、b、c条件的WHERE查询执行逻辑及扫描方式咨询
MySQL查询执行逻辑分析(含a、b、c列条件的WHERE子句)
假设你指的是联合索引(a, b)(如果是两个单独的单列索引,MySQL优化器通常会选择过滤性更好的那个,逻辑类似),MySQL的执行逻辑取决于WHERE子句中a、b、c条件的具体写法,以下分场景说明:
核心判断逻辑
MySQL优化器会优先利用索引缩小待处理的数据范围,再过滤剩余条件,不会单独对c列做全表扫描。具体执行方式分以下几种情况:
1. 充分利用(a,b)联合索引的场景
如果a是等值条件,b是等值或范围条件(比如WHERE a=10 AND b>5 AND c='test'):
- MySQL会先执行Index Range Scan(索引范围扫描),通过联合索引快速定位所有符合
a和b条件的记录,拿到对应的主键(InnoDB二级索引会存储主键值)。 - 接着通过主键回表查询完整行数据,再过滤符合
c条件的记录。 - 这种场景下,只会扫描索引中符合a、b条件的部分,以及回表后的对应行,不会涉及全表扫描。
2. 仅利用联合索引前缀的场景
如果a是范围条件(比如WHERE a>20 AND b=15 AND c=3):
- 联合索引只能用到
a的部分,MySQL会对a做索引范围扫描,筛选出a>20的所有记录。 - 之后在这些筛选后的记录里,逐一检查
b和c的条件。 - 同样不会做全表扫描,数据范围已经通过索引缩小。
3. 索引完全失效的场景
如果a的条件无法触发索引(比如WHERE a LIKE '%abc' AND b=5 AND c=10):
- 这时候(a,b)索引完全用不上,MySQL会执行全表扫描,遍历所有行并同时过滤a、b、c三个条件。
- 注意:这是对整个表的扫描,不是专门针对c列的全表扫描。
补充疑问解答
MySQL不会单独对c列执行全表扫描:
- 只要a、b的条件能触发索引扫描(不管是等值还是范围),都会先通过索引把数据集缩小到很小的范围,再在这个范围内检查c的条件。
- 只有当索引完全失效时,才会做全表扫描,但这是扫描整个表的所有列,而非只针对c列。
内容的提问来源于stack exchange,提问作者Iggydv
相关产品推荐
相关产品推荐

