我环顾四周,似乎没有任何简单的方法可以做到这一点。几乎看起来更容易获取记录的子集并在代码 (perl) 中进行所有随机化。我在网上看到的方法似乎最多适用于数十万,但肯定不是数百万。
我正在使用的表有 600 万条记录(并且还在增加),ID 会自动递增,但并不总是存储在表中(非无缝)。
我已尝试执行推荐的 LIMIT 1 查询,但该查询需要永远运行 - 如果记录中存在间隙,是否有快速的方法来执行此操作?我不能只取最大值并在范围内随机化。
更新:
我的一个想法可能是获取最大值,根据最大值随机化一个限制,然后获取从 random_limit_1 到 random_limit_2 的 10 条记录的范围,然后获取在该范围内找到的第一条记录。
或者,如果我知道最大值,有没有一种方法可以只选择表的第 5 条记录,而不必知道它是哪个 ID。然后只需获取该记录的 ID。
更新:
这个查询有点快。还是不够快=/
SELECT t.id FROM table t JOIN (SELECT(FLOOR(max(id) * rand())) as maxid FROM table) as tt on t.id >= tt.maxid LIMIT 1
最佳答案
SELECT * FROM TABLE ORDER BY RAND() LIMIT 1;
好的,这很慢。如果您搜索 ORDER BY RAND() MYSQL
,您会发现很多结果都说这很慢,事实就是如此。我做了一些研究,发现了这个替代方案 MySQL rand() is slow on large datasets
我希望这会更好
关于mysql - 从具有数百万非顺序记录的mysql表中快速选择随机ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449662/