日期:2014-05-16  浏览次数:20808 次

【征询意见】两条SQL语句查询效率比较,那条更优
1,
SQL code
SELECT * FROM  news WHERE  TYPE IN (SELECT id FROM  classify WHERE type='2')


2,
SQL code
SELECT n.* FROM news n,classify c WHERE c.id=n.type AND c.type='2'



最好能说个理由,今天同事们为了这两个语句辩论了整整一中午了噶


下班前结贴,谢谢大虾们赐教

------解决方案--------------------
explain出来

or

set profiling=1
show profiles
show profile for query 1;

------解决方案--------------------
效率无非指的是cpu消耗,内存消耗,io消耗,给我们最直观的感觉当然是执行时间

看这两个语句哪个执行快,就代表在当前服务器状态下哪个效率高
------解决方案--------------------
索引能否修改
在classify上建立id、type联合索引
news上建立type索引
------解决方案--------------------
据不完全的统计,第二种可能会更好。
------解决方案--------------------
探讨
据不完全的统计,第二种可能会更好。

------解决方案--------------------
贴建表及插入记录的SQL
实际上你自己测试 一下,看看执行时间就判断出来了
------解决方案--------------------
探讨
项目正在做,没有真实数据!很多人测试的结果都不一样,所以才发帖询问

------解决方案--------------------
这个问题无法直接下结论,要看具体的情况。

1. 索引的情况如何? 如果没有任何type上的索引,则理论上两个差不多。
2. 每个表中的数据情况,每个表中的记录总数是多少?如果两个表中都只有10条记录,则没什么差别,所有记录都可以在内存中搞定。

------解决方案--------------------
探讨
两个表都只有ID一个主键索引,其它什么索引都没有,也没有联合索引

------解决方案--------------------
没看懂第二个,n.id?? 一看还以为是C#还是Java的点操作
------解决方案--------------------

第二个效率应该要高点。。
------解决方案--------------------
学习~~~
------解决方案--------------------
我就得都不错,只是有些地方要改改
------解决方案--------------------
mark,我不凭感觉说话了。
------解决方案--------------------
要随前后文件改,可能第二个好一点。
------解决方案--------------------
长见识;啦
------解决方案--------------------
学习~~~
------解决方案--------------------
嗯不错很好啊!多多学习~~
------解决方案--------------------
两条语句是一样的。

你们公司没懂sql执行计划?

SQL code
SELECT n.* FROM news n,classify c WHERE c.id=n.type AND c.type='2'

SELECT * FROM  news WHERE  TYPE IN (SELECT id FROM  classify WHERE type='2')

SELECT * FROM  news n join classify c  on n.TYPE=c.ID where type='2'

SELECT * FROM  news n inner join classify c  on n.TYPE=c.ID where type='2'

------解决方案--------------------
in 用 EXISTS 改写,也是一样。
------解决方案--------------------
理论上一样
------解决方案--------------------