为何含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
相关产品推荐
相关产品推荐

