子查询的索引问题
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
它就不会扫描全表了
楼主用等价于多换位一下就看个大概了
在此预祝楼主早日成功。