用or查询无法使用索引?!真的是这样吗??

gzpepco 2012-03-13 01:46:56
看过很多文章都说用or索引会失效,例如某文:

“  Select * from table1 where tid=2 or tid=3
  会引起全表扫描,如果tid上有索引,其索引也会失效。



事实真的如此吗??我在sql2000,百万级别的一个表实验了一下,在创建索引情况下,用类似上面or查询仅仅用时一秒不到啊,这叫索引没用嘛?
...全文
1297 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
_0筱筱0_ 2012-03-13
  • 打赏
  • 举报
回复 3
OR会引起索引失效的说法是这样来的:
如果是这样一个查询
SELECT * FROM TB WHERE A=1 AND B>2 AND C<3 AND D IN (4,5,6)
并且在TB表上有这样一个索引:CREATE INDEX INX_TB_ABCD ON TB (A,B,C,D)
那么这个查询可以用到这个索引
如果同样是这个索引,查询换成
SELECT * FROM TB_ WHERE A=1 OR B>2 OR C<3 OR D IN (4,5,6)
那么这个查询就用不到上面那个索引,因为结果集是几个条件的并集,最多只能在查找A=1的数据时用索引,其它几个条件都需要表扫描,那优化器就会选择直接走一遍表扫描,所以索引就失效了。

那么像第二个查询这样的应该怎么建索引呢,答案就是四个列上各建一个索引,或者只在选择性最高的列上建索引,比如A=1的数据量很少,就在A上建,如果D是4,5,6的数据很少,就在D上建,这样优化器就会选择先走索引查找,再对找出的结果集进行筛选,扫描数就会大幅减少。

回过头来看你上面那个查询,两个条件都在TID上,所以只有TID上有一个索引就OK了,不存在索引失效的问题。

看书不要全信,多想想书上为什么这么说,自己多试试。
勿勿 2012-03-13
  • 打赏
  • 举报
回复
自己多试才是因地制宜。。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 haiwer 的回复:]

自己测试下,这样的说法别全信

至少这个例子肯定索引有效
[/Quote]

实践是检验真理的唯一标准
黄_瓜 2012-03-13
  • 打赏
  • 举报
回复
小时候到现在一直记得不知道在哪看的“尽信书不如无书”
昵称被占用了 2012-03-13
  • 打赏
  • 举报
回复
自己测试下,这样的说法别全信

至少这个例子肯定索引有效
gzpepco 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 travylee 的回复:]
你是select * from tbl 那你试试别的看看??
[/Quote]
什么意思呢?
  • 打赏
  • 举报
回复
你是select * from tbl 那你试试别的看看??

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧