【发布时间】:2013-05-26 13:52:54
【问题描述】:
我读过一篇关于如何从包含大量数据的 SQL 表中随机选择一行(在某些条件下)的文章。他们得到 id 的最大值和最小值,并在它们之间生成一个随机数,并得到第一行的 id 比那个大。但是,我的 id 分布不均匀,所以我没有得到真正随机的行。例如,如果我的 id 是 1、100、101,我将几乎没有机会获得后面的两行。
但我想到了另一种解决方案。我没有获取最大 id,而是计算查询中的所有行,获取一个随机数 i 并选择第 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");
但是,我怀疑它的有效性。任何人都可以给我一些想法,或者为我的案例提出解决方案。谢谢。
【问题讨论】:
-
当我需要一个类似的查询时,我研究了一段时间,这与我最终采用的方法相同。如果您使用的是 MISAM,count() 会很快,并且您没有使用 ORDER BY,这会有所帮助。你做过一些基准测试吗?
-
使用大的
OFFSET会导致延迟,因为 MySQL 必须实际遍历结果集才能到达请求的位置(与选择大于给定值的第一个 ID 不同,它可以检查找到正确行的索引)。 -
@markdwhite:不,我只在我的小桌子上测试过。
-
@Amber:我们有解决方案吗?
-
@dvtrung94 并非如此,除了向您的数据添加索引且均匀分布的 id 列。