从Mysql数据库表(大数据集)中检索50条随机记录

3

我需要从一张表中检索出若干个随机记录。该表包含约100000条记录。

这些记录不能是连续的,性能也很重要。

我尝试过"order by rand()",但性能很差(大约3秒)。


随机化大型数据集。相关问题请参考http://stackoverflow.com/questions/3558665。 - Haim Evgi
我认为除非有其他的过滤条件,否则你无法加快速度... 引擎仍然需要遍历 100,000 条记录,并为应用的顺序分配临时的 "RAND()" 集合(内部)。 - DRapp
1
@catcall,我认为他的意思是数据库中的记录不一定是连续的(1,2,4,5,6,9)而不是(1,2,3,4,5) - gnur
1
你尝试过从其他来源获取熵吗?比如将PRNG转储到文件中?这样可以很快地获得50个无符号整数,因此查询的工作量很小。 - Tim Post
@TheBlastOne - 关键是自动编号。我还有一个唯一的短标识(varchar)。 - Daniel
显示剩余4条评论
3个回答

0
你可以尝试在 PHP 循环中实现它,但我怀疑它会更快。
$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;
        }
    }
}

它可以适用于1-5个产品,但对于50-100个产品,它将会对性能产生巨大影响。 - Daniel

0
SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table);
PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1';
EXECUTE STMT USING @o;

0

我刚刚在一个有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秒)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接