如何有效地从一张大桌子中随机排出一行?

时间:2013-01-17 06:19:03

标签: mysql sql

  

可能重复:
  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点......),所以任何建议都会非常感激。谢谢!

2 个答案:

答案 0 :(得分:1)

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

SELECT(范围内的随机数)FROM信息

答案 1 :(得分:0)

如果您使用的是INNODB引擎,我之前阅读的文章建议最好先使用COUNT(*)计算记录数,因为引擎不会缓存表的计数,而不是{ {1}},

MyISAM

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