Possible Duplicate:
How do I select random rows in 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点……),所以任何建议都非常感谢。谢谢!

最佳答案

如果您使用的是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;

SQLFiddle Demo
免责声明:我使用的查询完全按照需要在3m记录上执行。不过,我不知道它在700万张唱片上的表现。

07-25 22:49