代码之家  ›  专栏  ›  技术社区  ›  Dennis Haarbrink

随机化大数据集

  •  2
  • Dennis Haarbrink  · 技术社区  · 14 年前

    我们预计该集将增长到~500K个记录,因此在该集增长的同时找到一种保持良好性能的方法非常重要。

    我尝试了一种技巧: http://forums.mysql.com/read.php?24,163940,262235#msg-262235 但这并不完全是随机的,也不能很好地与 LIMIT 子句,您并不总是获得所需的记录数。

    可以 使用具有特定状态的,所以这也不起作用。

    我使用的是mysql 5.1.46,MyISAM存储引擎。
    重要的是要知道,选择随机行的查询将非常频繁地运行,并且从中选择的表将经常追加到其中。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Paul Sasik    14 年前

    你可以通过一些非规范化来解决这个问题:

    • 构建一个二级表,该表包含与数据表相同的pkey和status
    • 添加并填充一个状态组列,该列将是您自己自动编号的子pkey(基于1的相对于单个状态的自动增量)
    Pkey    Status    StatusPkey
    1       A         1
    2       A         2
    3       B         1
    4       B         2
    5       C         1
    ...     C         ...
    n       C         m (where m = # of C statuses)
    

    有几种方法可以构建此表。你可以有一个程序,你运行的时间间隔或你可以做它活。后者将是一个性能打击,因为计算StatusPkey可能会变得昂贵。

        2
  •  1
  •   ircmaxell    14 年前
        3
  •  0
  •   Bill Karwin    14 年前

    您可以高效地执行此操作,但必须在两个查询中执行。

    首先获取一个随机偏移量,该偏移量按与5%条件匹配的行数缩放:

    SELECT ROUND(RAND() * (SELECT COUNT(*) FROM MyTable WHERE ...conditions...))
    

    LIMIT 表达式:

    SELECT * FROM MyTable WHERE ...conditions... LIMIT 1 OFFSET ?