Php 从Mysql数据库表(大数据集)中检索50条随机记录
我需要从表中检索一些随机记录。该表包含大约100000条记录 记录不得连续,绩效很重要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
我尝试了“
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;