好的,所以我有一个存储游戏数据的表,它已达到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点......),所以任何建议都会非常感激。谢谢!
答案 0 :(得分:1)
你能先生成随机数吗?假设你只需要一行,
SELECT(范围内的随机数)FROM信息
答案 1 :(得分:0)
如果您使用的是INNODB
引擎,我之前阅读的文章建议最好先使用COUNT(*)
计算记录数,因为引擎不会缓存表的计数,而不是{ {1}},
MyISAM
免责声明:我使用的查询完全根据需要在3米记录上执行。我不知道它在7m唱片上的表现如何。