【问题标题】:Selecting 10 rows randomly in mysql在mysql中随机选择10行
【发布时间】:2015-02-20 22:36:17
【问题描述】:

如何从至少有 100 万个寄存器的表中随机获取 10 行?我读到了 random() 的顺序,但很多人说它太慢了。在这种情况下我可以使用哪种算法?

【问题讨论】:

    标签: mysql random random-sample


    【解决方案1】:

    ORDER BY RAND() LIMIT n 确实很耗时。但它确实提供了很好的n 不同行的伪随机选择。

    你可以试试这个。它仍然需要扫描您的表,但不必进行排序。这不能保证正好十行;它可能产生更多或更少。

    SELECT *
      FROM (
              SELECT a.*
                FROM mytable a
                JOIN (select COUNT(*) rowcnt, 10 samplecnt from mytable) c
               WHERE RAND() <= (CAST(samplecnt AS DOUBLE) )/ CAST(rowcnt AS DOUBLE)
           ) sample
     ORDER BY rand()
    

    它通过使用伪随机数来选择是否将表格的每一行包含在结果集中。

    在我有 750K 行的测试表上,ORDER BY RAND() LIMIT 10 方法比 WHERE RAND() &lt;=... 方法慢三倍。

    【讨论】:

    • 我希望你不介意我在我的博客(上图)中将你的技术添加为第 8 项。在此过程中,我将COUNT(*) 替换为从information_schema 提取的TABLE_ROWS,从而使速度翻了一番。 mysql.rjweb.org/doc.php/…
    猜你喜欢
    • 2010-11-19
    • 2011-05-18
    • 2011-09-26
    • 1970-01-01
    • 2011-04-16
    • 2018-04-03
    • 1970-01-01
    相关资源
    最近更新 更多