我在 mySQL 标记中看到很多关于如何最好地从一个非常大的表中选择 N 个随机项的问题。大多数时候,答案似乎归结为ORDER BY RAND() LIMIT N
,但我相信这最终会变得非常低效,因为它必须为每一行生成一个随机数,然后根据这个未索引的字段对结果集重新排序。
我的想法是做如下的事情:[用 PHP-esque 伪代码编写,但应该翻译成任何语言]
$rowcount = query("
SELECT COUNT(*) FROM mytable WHERE [condition];
");
$rand_index = rand(0, $rowcount); // random int between 0 and $rowcount
$rand_row = query("
SELECT field1, field2, ...
FROM mytable WHERE [condition]
LIMIT $rand_index, 1
");
// repeat last 2 lines as needed to get N rows.
这些查询不应该比 a 快得多,ORDER BY RAND() LIMIT N
因为它们将使用在使用的表中定义的索引吗?