MySQL中简单WHERE条件是否优先于带前缀通配符的LIKE子句执行?
结论
MySQL会优先执行可命中索引的organization_id等值条件过滤,再对筛选后的结果集执行带前缀通配符的LIKE匹配,不会先执行全表通配符搜索。
原理说明
- MySQL查询优化器的核心逻辑是优先选择成本最低的执行路径:可命中索引的等值过滤的IO成本、计算成本远低于全表扫描后做通配符匹配,因此会被优先执行。
- 你给出的场景中,
organization_id有对应的B+树索引,通过该索引可以快速定位到所有organization_id = 1的行,之后仅需要对这部分远小于全表规模的结果集,逐行校验name LIKE '%abc%'的条件即可,整体执行效率远高于全表扫描后再过滤。
执行计划佐证
从你提供的EXPLAIN执行计划可以验证这个逻辑:
- 执行计划的
key字段显示使用的是users_organization_id_foreign索引,而非全表扫描 type字段值为ref,代表走了索引的等值匹配查询rows字段展示的预估扫描行数,就是organization_id = 1对应的预估数据量,远小于全表行数
补充说明
只有当查询没有任何可用索引时,MySQL才会走全表扫描,逐行同时校验所有WHERE条件。只要存在可命中的高效索引,优化器一定会优先通过索引过滤掉尽可能多的行,再对剩余数据执行其余无法用到索引的校验逻辑(包括全模糊LIKE匹配、字段计算等场景)。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

