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万张唱片上的表现。