清风徐来
知是行之始,行是知之成

Mysql的随机读取

PHP mysqlRAND随机 约 2 分钟

随机读取数据库记录,搜索发现很多人都使用 order by rand() 来达到该目的,这是mysql提供的功能。但是实际上存在非常严重的性能问题。 如果表里记录不多,偶尔用一下也可以。但是如果数据多的话,就会凸显出查询的性能问题。

随机查询5条记录:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5;

在数十万记录的表里,这样的查询要好几秒的时间。下面采用JOIN的方式改进一下:

SELECT * FROM `table` AS t1 JOIN (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 5;

这样得到连续的5条记录。要不联续的记录,可以连续查询几次,每次limit 1条。这清风比较推荐,SQL语句比较清晰,效率也不错。

还有,可以这样的:

SELECT * FROM `table` WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM `table`))) ORDER BY id LIMIT 1;

其他更复杂的实现,清风无视之。

update:2011年8月24日 15:03:26

如果随机抓取,并且要分页呢?

在表里增加一个sortbyrand字段。要随机排序時只需一个简单的sql。

例如记录总数是10000 update table_name set sortbyrand=FLOOR(RAND()*10000); 抓取只需要order by sortbyrand就可以了,其实这个是最不耗脑子的。