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

Php 从Mysql数据库表(大数据集)中检索50条随机记录,php,mysql,random,Php,Mysql,Random,我需要从表中检索一些随机记录。该表包含大约100000条记录 记录不得连续,绩效很重要 我尝试了“orderbyrand()”,但是性能很差(~3秒)您可以尝试在php循环中执行,但我怀疑它会更快 $iMaxID = getMaxIdFromYourTable(); //not real php $records = array(); while (true) { $iRandID = rand(1,$iMaxID); thisRecord = "SELECT FROM your

我需要从表中检索一些随机记录。该表包含大约100000条记录

记录不得连续,绩效很重要


我尝试了“
orderbyrand()
”,但是性能很差(~3秒)

您可以尝试在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;
        }
    }
}

我刚刚运行了一个简单的
SELECT*fromtableorderbyrand()limit50在包含229291行的表上。在0.63秒内完成。考虑到RAND()的速度非常慢,应该有更好的解决方案

我只知道从一个大数据集中选择一个随机行的各种替代方法,比使用
orderbyrand()
更快。这里解释如下:

对于多个随机行,我目前还不知道更好的解决方案。如果ID是后续的,并且其间没有缺少ID,则可以在自己的PHP代码中生成一个以逗号分隔的随机数列表,然后使用
SELECT*从ID所在的表(5,3,1)中选择查询

在另一个堆栈溢出问题中,下面是一个可行的解决方案:


为我工作,对于包含229291条记录的表,设置了50行(0.09秒)。

相关主键的内容是什么样的?该表还有哪些独特的属性或属性组合?我不认为你可以更快,除非有其他筛选条件。。。引擎仍然需要遍历100000条记录,并为所应用的顺序(内部)为集合分配临时的“RAND()”。@catcall,我认为他的意思是数据库中的记录不一定是连续的
(1,2,4,5,6,9)
而不是
(1,2,3,4,5)
您是否尝试过从其他来源获取熵,例如将PRNG转储到文件中?这样可以很快得到50个无符号整数,因此唯一的工作就是查询。它可以用于1-5个产品,但对于50-100个产品,它将对性能产生很大影响
SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table);
PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1';
EXECUTE STMT USING @o;