首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

【征询意见】两条SQL语句查询效率比较,那条更优解决方案

2012-02-20 
【征询意见】两条SQL语句查询效率比较,那条更优1,SQL codeSELECT * FROMnews WHERETYPE IN (SELECT id FROMc

【征询意见】两条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 改写,也是一样。
[解决办法]
理论上一样
------解决方案--------------------


好的数据库引擎会优化成一样的

另外,type最好加上索引
[解决办法]
我觉得两个语句都是一样的效率!
在SQL 2005中 ,第二条语句
SELECT n.* FROM news n,classify c WHERE c.id=n.type AND c.type='2'
表news有聚集索引但是查询中没有用到news.id因此对于表news做了一个聚集所以扫描运算,相反对classify表做了一个聚集索引查找运算,然后再进行嵌套循环
第一条查询也是一样的分析,所以效率都是一样的。

[解决办法]
应该效率是一样的。
因为都从WHERE 开始遍历表。
两张表都遍历了一次
[解决办法]

差不多吧

第一个先执行子查询

第二个先执行c.type='2',再执行连接

这样2个理论上就差不多了
[解决办法]
差不蛮多!!!!!!!!!!!!!!!!!
[解决办法]
挺好的
[解决办法]
关于这个问题其实以前就有一个类似的讨论。
http://topic.csdn.net/u/20090626/16/65f043cf-b9d9-4707-b660-9857461177f4.html
[解决办法]
路过接分路过接分路过接分路过接分
[解决办法]
如果数据量很大的话,比如两个表都有超多行数据DBMS会选择最优方式去执行,不会有什么差别;如果数据量少的话内存中就解决了
[解决办法]
理論應該是一樣的,注重要看那兩個表各自的索引情況,一般情況都習慣用第二種。
[解决办法]
从表面看是第二种,但还是要根据真实数据的
[解决办法]
关注学习中!!!
[解决办法]
我觉得第二种好
[解决办法]
插入100万数据测试依下不就完了?
[解决办法]
第二条比第一条快。数据量大时IN的效率不高。
[解决办法]

探讨

引用:
两个表都只有ID一个主键索引,其它什么索引都没有,也没有联合索引
第二个应该高一点,用到了id索引。

[解决办法]
探讨

第二条比第一条快。数据量大时IN的效率不高。

[解决办法]
LZ可以用大数据量测试看看
[解决办法]
我也觉得第二种方法会好一些

第一种方法用IN,数据量太大应该会很差~

(我也没有测试过,属于个人理解!期待最权威的论证结果)
[解决办法]
拿到数据库里执行下 记录下时间 测试下不就出来了?
[解决办法]
如果是我会把第二条查询语句写成inner join的连接方式,不过DBMS优化过以后也应该是这样,所有大数据量时也许第二条语句更好
[解决办法]
感觉LZ的两条查询语句逻辑都不相同哦
[解决办法]
测试胜于雄辩
[解决办法]
这个在数据库系统概论第四版里面有讲到...
记得是第一条优
[解决办法]
我的意见:第一种好,从底层来说,只要是select就是执行了 笛卡尔积和除法操作,第一句层次分明易于理解,第二句sql执行了笛卡尔积和投影操作。
[解决办法]
数据库会退sql进行一定的优化。想这种情况,两个的执行计划应该一样。
------解决方案--------------------


mark 那种才是真的好啊 晕
[解决办法]
sql 会自己优化?
[解决办法]
这个要看表中的数据而言

热点排行