这是从表中选择随机行的快速方法

时间:2013-05-26 02:31:15

标签: php mysql

我读过一篇关于如何从包含大量数据的SQL表中随机选择行(具有某些条件)的帖子。它们获取id的最大值和最小值,并在它们之间生成一个随机数,并获得id大于该值的第一行。但是,我的id不是均匀分布的,所以我没有得到真正随机的行。例如,如果我的id为1,100,101,我几乎没有机会获得后两行。

但我想到了另一种解决方案。我没有获得最大ID,而是计算查询中的所有行,得到一个随机数i并选择第一行。代码看起来像这样

$count_res = $mysqli->query("SELECT COUNT(*) FROM quest WHERE category IN ({$mem['my_cate']})");
$count = $count_res->fetch_array();
$rand_id = rand(0, $count[0] - 1);

$result = $mysqli->query("SELECT * FROM quest WHERE category IN ({$mem['my_cate']}) LIMIT 1 OFFSET $rand_id");

然而,我怀疑它的有效性。任何人都可以给我这个想法,或建议我的案例的解决方案。感谢。

2 个答案:

答案 0 :(得分:1)

好吧,我做了一些基准测试。我创建了一个只有一列自动增量ID的表。然后我添加了1,700,000条记录。由于只有一列,我想它会比实际更快,但这是我的基准测试:

方法1:选择一个行数,然后使用PHP选择一个随机数,然后根据偏移量进行选择。 (我将偏移量固定在表的末尾,因为它会比表的开头慢。)

选择计数:12毫秒

选择偏移:513ms

总计:525毫秒

方法2:在整个桌子上选择一张RAND()。

总计:2,190毫秒

WINNER =方法1

可能的方法3:这有点像我想的那样,并不一定适用于所有情况。因此,您的想法是在表中获取最后一个自动增量ID,生成1和最后一个自动增量编号之间的随机数,然后选择大于或等于该ID编号的第一行。您必须执行大于或等于,因为可能缺少ID号。

选择最后一个ID:10.1ms

选择随机行:6.3ms

总计:16.4毫秒

答案 1 :(得分:-2)

使用类似的东西可能会更快:

$result = $mysqli->query("SELECT * FROM quest WHERE category IN ({$mem['my_cate']}) ORDER BY Rand() LIMIT 1");

因为它只使用一个查询而您可以跳过该顶部位。您可以通过在几千个循环中尝试两种方式或您决定的任何数量来对它进行基准测试,并比较循环前后的microtime()。