mysql - 从具有数百万非顺序记录的mysql表中快速选择随机ID

标签 mysql random recordset

我环顾四周,似乎没有任何简单的方法可以做到这一点。几乎看起来更容易获取记录的子集并在代码 (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/

相关文章:

php - mysql 显示表中添加的所有行

mysql - 需要知道MySQL数据库中保存的字节数组的类

c - rand() 的实现

shell - 通过 Shell 脚本创建 Route53 记录集

MySQL 选择记录集中的 WHERE

php - 我正在尝试显示在线用户列表

php - 删除按钮未返回删除查询的正确值

vbscript - 经典 ASP 迭代和对象

Java:随机生成不同的名称

php - 如何修复mysql随机错误