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

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

    使用的数据库是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

本文出自:冯立彬的博客




你可能感兴趣的:(JOIN,sql,优化,mysql,数据库,server,测试)