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

标签: mysql mysql5


【解决方案1】:

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

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

【讨论】:

  • 我不想要前 1000 个条目,我想要 1000 个随机条目。
猜你喜欢
  • 2011-02-01
  • 2012-08-30
  • 2020-10-27
  • 2010-09-08
  • 2021-02-22
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2011-02-12
相关资源
最近更新 更多