2013-03-15 63 views
1

我有一个由连接组成的查询,并且有大约30,000多条记录的输出。我想从这些记录中得到10个随机行而不使用SQL命令ORDER BY rand()。从查询中获取10行

我试着循环遍历记录,并把它们放在一个数组中,并随机播放(获得shuffle后的前10个),但它需要大约8-12秒才能生成。我想不惜一切代价减少这个处理时间。

我该如何做到这一点?

+0

你目前的查询是什么? – 2013-03-15 14:59:50

+0

为什么你不想使用rand()? – creinig 2013-03-15 15:00:16

+0

我不确定是否有可能从没有使用rand的查询中获得随机行。你在使用MySQL吗? – chawkinsuf 2013-03-15 15:01:57

回答

8

好吧,如果你不希望使用RAND()做一个更快的选择只是ID列的第一则仅选择要

  1. 10行选择ID添加到$ idarray
    SELECT id FROM table
  2. 洗牌和切$ idarray
    shuffle($idarray);
    $ids=array_slice($idarray,0,10);
  3. 选择完整的行
    $sql="SELECT ... WHERE id IN (".implode(', ', $idarray).")";

编辑:这肯定比使用ORDER BY RAND()快得多!

+1

从数据库中获取30000+个ID(并且正在增长),对它们进行混洗然后扔掉其中的29990+肯定会比让RDBMS进行随机化要慢得多... – creinig 2013-03-15 15:08:16

+0

我刚刚测试过从一个数据库和ORDER BY RAND()限制* 10只是id列*比没有ORDER BY和LIMIT长30倍以上。 – Popnoodles 2013-03-15 15:11:33

+0

...使用ORDER BY和LIMIT选择30列需要1000多倍的时间。 PHP需要0.003秒来洗牌并分割30,000个ID。 – Popnoodles 2013-03-15 15:28:53