我需要从一张表中检索出若干个随机记录。该表包含约100000条记录。
这些记录不能是连续的,性能也很重要。
我尝试过"order by rand()
",但性能很差(大约3秒)。
$iMaxID = getMaxIdFromYourTable(); //not real php
$records = array();
while (true) {
$iRandID = rand(1,$iMaxID);
thisRecord = "SELECT FROM yourtable WHERE id = $iRandID";
if (numrows > 0) {
$records[] = thisRecord;
if (count($records) > 50) {
break;
}
}
}
SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table);
PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1';
EXECUTE STMT USING @o;
我刚刚在一个有229,291行的表上运行了一个简单的SELECT * FROM table ORDER BY RAND() LIMIT 50;
查询。完成时间为0.63秒。考虑到RAND()函数的速度非常慢,应该有更好的解决方案。
我只知道选择一个大数据集中的一个随机行的各种替代方法,比使用ORDER BY RAND()
要快。这里有解释:http://wanderr.com/jay/order-by-slow/2008/01/30/
对于多个随机行,我目前不知道更好的解决方案。如果ID是连续的,并且之间没有缺失的ID,您可以在自己的PHP代码中生成一个逗号分隔的随机数列表,然后使用SELECT * FROM table WHERE id IN(5,3,1);
查询。
这里是另一个Stack Overflow问题的工作解决方案:How can i optimize MySQL's ORDER BY RAND() function?
对我来说很有效,处理了拥有229,291条记录的表格,50行数据(0.09秒)。
(1,2,4,5,6,9)
而不是(1,2,3,4,5)
。 - gnur