You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:05:18