MySQL获取随机记录SQL性能比较


为了保证数据足够多,请使用快速插入数据sql语句

insert into tbl (id,title) (SELECT id,title from tbl);

 

一开始我也非常喜欢mysql的至简,比如分页,就连获取随机也是这么方便。相信大家对这条随机肯定十分熟悉

SELECT * FROM `tbl` ORDER BY RAND() LIMIT 5

 

事实上面我也非常喜欢,因为它简单而且体现的非常快,包括Wordpress获取随机文章默认也是这种形式。

这条在小数据量的时候,是看不出它具体有什么问题的,一旦你的数据超过了10W或者更大的时候,恭喜你你可以和喝几杯咖啡了。

关于rand函数在mysql手册上是这么写的

在ORDER BY语句中,不能使用一个带有RAND()值的列,原因是 ORDER BY 会计算列的多重时间。

官方都建议不要在order by中使用rand函数了,我还能说什么?具体的性能测试有很多人写过这方面的文章,具体可以看这里 。

他们也做过很多了测试,当然我也是按照我自己的数据量进行测试,我个人非常喜欢这条语句,算是他们两篇文章的总结吧,要想快速获取随机文章就用这条sql语句。

 

SELECT * FROM `tbl` AS a 
JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `tbl`)-(SELECT MIN(id) FROM `tbl`))+(SELECT MIN(id) FROM `tbl`)) AS id) AS b
WHERE a.id >= b.id ORDER BY a.id LIMIT 5;

ps:也可以在程序中进行设置随机码。我之前是这么处理的。

 

//伪代码
$limit =5;//显示条数
$count = "select count(*) from table";
$start = mt_rand ( 0, $count - $limit );
$list = "select * from table limit ".$start.",".$limit;

 

这个生成出来的其实和上面使用sql语句效果是一样的。我个人建议还是使用程序来处理比较好。


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

评论审核已启用。您的评论可能需要一段时间后才能被显示。