您的位置:首页 > 数据库

从数据库中随机查询记录,使用JOIN比使用WHERE的效率要好

2011-11-27 13:47 495 查看
现在有这样的业务场景,从一个内容表中随机查询一条数据,并且随机查随出来的记录还不能够是已经使用了的记录,这里有一个专门的表记录了哪些记录是使用了,也就是在做这样的随机查询的时候,还需要关联发送记录保存表,这样才可以确保查询出来的记录是没有被使用过的。

使用的数据库是MYSQL5.5,内容表有2万多条记录,保存发送记录的表只有数10条记录,以下是分别是直接使用where和使用join的测试语句:

直接使用where:

SELECT * FROM `msg` a

WHERE not exists (select 1 from users_send_msg b where b.msg_id=a.id)

and a.id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `msg`)-(SELECT MIN(id) FROM `msg`)) + (SELECT MIN(id) FROM `msg`)))

LIMIT 1;

这条语句我这边执行几十次,时间通常都是在.0.00到0.04秒之间,而下面这条使用join的语句:

select * FROM `msg` AS t1

JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `msg`)-(SELECT MIN(id) FROM `msg`))+(SELECT MIN(id) FROM `msg`)) AS id) AS t2

WHERE not exists (select 1 from users_send_msg b where b.msg_id=t1.id)

and t1.id >= t2.id

ORDER BY t1.id LIMIT 1;

我执行的结果数10次的查询时间,都是显示的是0.00到0.01之间,并且大部份的执行时间都是0.00。那这个应该可以基本说明,join的效果的效果在这里确实要比直接使用where 好。

为什么where的效率要比join差呢,那是因为在SQL最终执行的时候,数据库通常会把where优化为join来执行。

参考:

not in的优化讨论:http://topic.csdn.net/u/20080611/19/db6bb206-2e79-479f-9d5f-e5beb90f37df.html

mysql随机查询若干条数据:http://blog.csdn.net/zxl315/article/details/2435368

SQL Server 中Inner join 和where的效率差异:http://tech.163.com/07/0309/14/395APR410009158J.html



本文出自:冯立彬的博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: