日期:2014-05-18  浏览次数:20467 次

子查询的索引问题
1w行的表
索引建在ID上 
select DATA2 from table1 where ID = (select ID from table1 where DATA1 =100)
逻辑读取为900多行 基本上遍历全表

select * from (select ID,DATA1 from table1 where DATA1 >100) as a where a.ID = 100
结果逻辑逻辑读取次数为3,我想知道为什么(select ID,DATA1 from table1 where DATA1 >100)这个查询没有遍历全表,而是根据索引找到了 索引列根本就不在DATA1上啊

两种写法结果是一样的 只是效率不同

------解决方案--------------------
lz:基于你的问题的解答:

select DATA2 from table1 where ID = (select ID from table1 where DATA1 =100)
你的第一个语句等价于
select DATA2 from table1 where DATA1 =100 (可能有多个)
你括号里面的必须扫描全表
select * from (select ID,DATA1 from table1 where DATA1 >100) as a where a.ID = 100
你的第二个语句等价于
select ID,DATA1 from table1 where a.ID = 100 and DATA1 >100 
它就不会扫描全表了

楼主用等价于多换位一下就看个大概了

在此预祝楼主早日成功。