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

为何含OR条件的SQL语句不使用多列索引?

为什么MySQL联合索引在AND条件生效、OR条件不生效?

假设你的联合索引是(last_name, first_name),要搞懂这个问题得先明白联合索引的物理结构:它是先按last_name排序,在last_name相同的前提下,再按first_name排序,整个索引就像一本先按姓氏排序、同姓再按名字排序的电话簿。

关于AND条件的索引使用

当执行SELECT * FROM test WHERE last_name='Jones' AND first_name='John';时:

  • 数据库可以先通过索引快速定位到所有last_name='Jones'的条目(对应电话簿里所有姓Jones的页面)
  • 这些Jones的条目里,first_name是有序排列的,所以能直接在这个子集里快速找到first_name='John'的记录,全程都能利用索引的有序性高效查询。

关于OR条件的索引失效

当执行SELECT * FROM test WHERE last_name='Jones' OR first_name='John';时:

  • 这个条件需要找两类数据:所有姓Jones的,加上所有名字是John的。
  • 联合索引里的first_name并不是全局有序的——只有在同一个last_name分组下,first_name才是有序的。要找所有first_name='John'的记录,数据库没法通过这个联合索引直接定位,因为这些John可能分布在Smith、Brown、Jones等各种不同姓氏的分组里,索引无法一次性把这些分散的条目筛选出来。
  • 此时MySQL无法有效利用(last_name, first_name)这个联合索引,只能走全表扫描,或者如果单独给first_name建了索引,才会考虑用两个索引分别查询再合并结果,但仅靠这个联合索引是用不上的。

内容的提问来源于stack exchange,提问作者wenjiehu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:13:10