如何从没有数字主键的表中有效地选择随机行

Posted

技术标签:

【中文标题】如何从没有数字主键的表中有效地选择随机行【英文标题】:How to select efficently random Rows from a table without a numeric primary key 【发布时间】:2013-10-25 16:49:40 【问题描述】:

从包含 100.000.000 条记录没有数字主键的表中提取 1000 个随机行的最有效方法是什么?

使用 ORDER BY RAND() 被排除在外,因为效率非常低。

环顾我发现的最佳方法如下:

SELECT key FROM (
    SELECT @cnt := COUNT( * ) +1, @lim := 1000 FROM table
)vars STRAIGHT_JOIN (
    SELECT r . * , @lim := @lim -1
    FROM table r
    WHERE (
        @cnt := @cnt -1
    )
    AND RAND( ) < @lim / @cnt
)i

这是使用 mysql 5 的最佳方法还是可以使用更有效的代码?

【问题讨论】:

Select ket from table limit 1000 有什么问题 Selecting random rows with MySQL 的可能重复项 这不是重复的,我对最通用的情况感兴趣(即字母数字主键、具有多列的主键等)我发现已经提出的许多解决方案仅适用于特定情况情况即:没有漏洞或价值分布均匀的自增指数。注意:我只想要 1000 行,而不是在 99.9% 的情况下提供 1000 行的解决方案。 @SashiKant 这不是随机的。如果我多次进行相同的查询,我将获得非常相似的结果。我也不想从表限制 RAND()*(number_of_rows-1000),1000 中选择键,因为只有第一行是真正随机的。 @Alma Do Mundo 请删除“可能重复”标志 【参考方案1】:

如果您只想获取前 1000 个条目(但您也可以声明偏移量),您应该查看 MySql 中的 Limit

http://dev.mysql.com/doc/refman/5.0/en/select.html

【讨论】:

我不想要前 1000 个条目,我想要 1000 个随机条目。

以上是关于如何从没有数字主键的表中有效地选择随机行的主要内容,如果未能解决你的问题,请参考以下文章

从没有主键的临时表中删除重复字段 [重复]

火花 jdbc 读取调整 where 没有主键的表

如何在 Postgres 中从具有非均匀分布的表中选择随机行?

从 SQL Server 表中选择 n 个随机行

如何在具有symfony主键的表中插入值

从另一个表中选择带有主键的数据?