2

可能重复:
如何在 MySQL 中选择随机行?

好的,所以我有一个存储游戏数据的表,它达到了 700 万行。

我需要一种有效的方法来选择随机行。

这是我到目前为止所尝试的:

SELECT `id` FROM `information` ORDER BY RAND() LIMIT 1;

相当合乎逻辑的查询。运行需要8 秒。完全不能接受。

第二次尝试:

SELECT FLOOR(RAND()*COUNT(`id`)) INTO @target FROM `information`;
SELECT `id` FROM `information` LIMIT @target,1;

由于第二个查询中的变量出现语法错误而失败。

第三次尝试:

SELECT `id` FROM (SELECT `id` FROM `information`) `a` ORDER BY RAND() LIMIT 1

这里的想法是去除所有其他字段,因为它们是不必要的体积。它工作了一半,将时间缩短到 6 秒。不过还是太长了。

还有……我出去了。我想不出任何其他方式(但现在是凌晨 1 点......),所以任何建议都将不胜感激。谢谢!

4

2 回答 2

1

你能先生成随机数吗?假设你只需要一排,

从信息中选择(范围内的随机数)

于 2013-01-17T06:23:46.587 回答
0

如果您使用的是INNODB引擎,我之前读过的一篇文章建议最好先计算记录数,COUNT(*)因为引擎不会缓存表的计数,不像MyISAM

DECLARE @count INT;
DECLARE @offset INT;

SET @count = (SELECT COUNT(*) FROM `information`);
SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED);

PREPARE mystatement FROM "SELECT `id` FROM `information` ORDER BY RAND() LIMIT ?, 1";
EXECUTE mystatement USING @offset;
DEALLOCATE PREPARE mystatement;

免责声明:我使用的查询在 3m 记录上完全按照需要执行。我不知道它在 7m 记录上的表现如何。

于 2013-01-17T06:29:01.530 回答