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

子查询与内联查询的效率问题请教(有请邹老大啊)
各位大大们,请教下子查询与内联查询的效率问题,tmsg(msgid索引),tmember(memberid索引)表数据都很多,下面两种方式哪种更好点,另请邹老大等发表下意见,感激......
select   a.*,(select   membername   from   tmember   where   memberid=a.memberid)   as   membername   from   tmsg   a

select   a.*,b.membername   from   tmsg   a   inner   join   tmember   b   on   a.memberid=b.memberid

------解决方案--------------------
个人感觉内联要好。
------解决方案--------------------
inner join 明显优于子查询
------解决方案--------------------
肯定是内连接好了,子查询,还要去遍历比较慢了!
------解决方案--------------------
select a.*,(select membername from tmember where memberid=a.memberid) as membername from tmsg a

select a.*,b.membername from tmsg a inner join tmember b on a.memberid=b.memberid

这两个语句没有可比性啊, 因为两个语句并不等效.
第1个查询得到的结果是left join的效果, 而且还要保证匹配的memberid唯一才不会导致查询出错
第2个语句是inner join的结果, 只有匹配的记录才会出现在结果集中, 而且对memberid是否唯一没有任何要求
------解决方案--------------------
内连接好一些



------解决方案--------------------
老大就是老大.....回答就是有风范~~~~~
------解决方案--------------------
..
------解决方案--------------------
个人觉得两者查询各有优点.要从效率上来区分两个的时候,要看两个表中元组的个数,如果元组个数少,那么连接的比较高,反之,子查询的比较高.
用数字来比较:假如有三张表,每个表中有10000行.
如果用连接查询的时候,三个表需要先做一个笛卡儿积,然后再从笛卡儿积当中筛选满足条件的结果.这样的话,如果这三张表连接的话形成的笛卡儿积有1万亿行,从中筛选数据,效率就可以而知.
使用子查询的话,最里层的查询如果有50行的话,那么中间子查询最多500000行,假如从中再筛选出100行的话,那么最外层查询最多1000000行,这样对于使用字查询的话,总共浏览的记录只有1500000,比连接查询的1万亿行要少的多,效率自然也就比较高了.
当然表中元组数少的话,使用连接查询就可以了.
另外两者之间的功能也有差别.连接查询查询的结果可以来源于多张表,而子查询结果只能来源于一张表
------解决方案--------------------
msgid和memberid都是唯一的,在我们这个系统中实现的功能是一样的

这个也不能保证两个语句的结果相同嘛, 我前面已经提到过, 一个是left join的效果, 一个是innter join的效果
数据结果不同, 数据扫描的方式也不同, 无从比较


如果只考虑你给的语句而言, 绝大多数情况下都是innter join的方案是最优的.
------解决方案--------------------
向邹老大学习
------解决方案--------------------
学习:)