我有一个由连接组成的查询,并且有大约30,000多条记录的输出。我想从这些记录中得到10个随机行而不使用SQL命令ORDER BY rand()。从查询中获取10行
我试着循环遍历记录,并把它们放在一个数组中,并随机播放(获得shuffle后的前10个),但它需要大约8-12秒才能生成。我想不惜一切代价减少这个处理时间。
我该如何做到这一点?
我有一个由连接组成的查询,并且有大约30,000多条记录的输出。我想从这些记录中得到10个随机行而不使用SQL命令ORDER BY rand()。从查询中获取10行
我试着循环遍历记录,并把它们放在一个数组中,并随机播放(获得shuffle后的前10个),但它需要大约8-12秒才能生成。我想不惜一切代价减少这个处理时间。
我该如何做到这一点?
好吧,如果你不希望使用RAND()做一个更快的选择只是ID列的第一则仅选择要
SELECT id FROM table
shuffle($idarray);
$ids=array_slice($idarray,0,10);
$sql="SELECT ... WHERE id IN (".implode(', ', $idarray).")";
编辑:这肯定比使用ORDER BY RAND()快得多!
从数据库中获取30000+个ID(并且正在增长),对它们进行混洗然后扔掉其中的29990+肯定会比让RDBMS进行随机化要慢得多... – creinig 2013-03-15 15:08:16
我刚刚测试过从一个数据库和ORDER BY RAND()限制* 10只是id列*比没有ORDER BY和LIMIT长30倍以上。 – Popnoodles 2013-03-15 15:11:33
...使用ORDER BY和LIMIT选择30列需要1000多倍的时间。 PHP需要0.003秒来洗牌并分割30,000个ID。 – Popnoodles 2013-03-15 15:28:53
你目前的查询是什么? – 2013-03-15 14:59:50
为什么你不想使用rand()? – creinig 2013-03-15 15:00:16
我不确定是否有可能从没有使用rand的查询中获得随机行。你在使用MySQL吗? – chawkinsuf 2013-03-15 15:01:57