首页 > SQL语句里使用OR关键字会使索引失效吗

SQL语句里使用OR关键字会使索引失效吗

看到OSChina上的两篇文章《OSChina 用户动态设计说明》和《OSChina 的留言表设计说明》中都提到,如果在SQL语句的查询条件中使用OR的话,会消除SQL优化的效果,索引在这里也会失去作用。

不明觉厉,求高手指点。


索引失效否和参与OR的条件的字段有没有索引以及索引类型相关

假设两个条件 A1 > 1 OR A2 > 2

以上是这学期数据库课上讲到的(实际实现和理论可能有不小出入)


没仔细看你提到的link, 是想说 因为用了or, 觉得mysql只能用一条索引, 所以就没法是用索引了?

mysql的一条查询是可以使用多个索引的, 同样适用于or的情况, 详见:
Index Merge Optimization
http://dev.mysql.com/doc/refman/5.7/en/index-merge-optimization.html


大多数SQL数据库的索引都是B+Tree之类的数据结构,这个结构是“有序”的,比如一个integer字段上的索引会按照这个字段的值进行排序,这种索引的优点在于可以支持range query,比如where f>100这样的条件可以充分有效的利用索引。
但是这种结构也会带来一个问题——不同的两个字段的索引的顺序并不相同,比如where f1>100 or f2<50这样的条件,你只能顺序扫描f1和f2的索引,这时你无法同时用两个索引判断一条记录是否满足条件,所以为了做这样的过滤,只能放弃其中一个索引,甚至做全表扫描。

【热门文章】
【热门文章】