【问题标题】:Retrieve 50 random records from a Mysql database table (large data set)从 Mysql 数据库表(大数据集)中检索 50 条随机记录
【发布时间】:2011-07-02 00:15:52
【问题描述】:

我需要从一个表中检索一些随机记录。该表包含大约 100000 条记录。

记录不能连续,性能很重要。

我尝试了“order by rand()”,但性能很差(~3 秒)

【问题讨论】:

  • 主键的内容是什么样的?该表还有哪些其他独特的属性或属性组合?
  • 我不认为你可以走得更快,除非有一些其他过滤标准......引擎仍然必须通过 100,000 条记录并为集合(内部)分配临时“RAND()”正在应用订单。
  • @catcall,我认为他的意思是数据库中的记录不一定是连续的(1,2,4,5,6,9)而不是(1,2,3,4,5)
  • 您是否尝试过从其他来源获取熵,例如将 PRNG 转储到文件中?这样你可以很快得到 50 个无符号整数,所以唯一的工作就是在查询中。

标签: php mysql random


【解决方案1】:
SET @o = (SELECT FLOOR(RAND() * COUNT(*)) FROM your_table);
PREPARE STMT FROM 'SELECT * FROM your_table LIMIT ?, 1';
EXECUTE STMT USING @o;

【讨论】:

    【解决方案2】:

    我刚刚在一个有 229,291 行的表上运行了一个简单的 SELECT * FROM table ORDER BY RAND() LIMIT 50;。在 0.63 秒内完成。鉴于 RAND() 真的很慢,应该有更好的解决方案。

    我只知道从大型数据集中仅选择一个随机行的各种替代方法,比使用ORDER BY RAND() 更快。这在这里解释:http://wanderr.com/jay/order-by-slow/2008/01/30/

    对于多个随机行,我目前不知道有更好的解决方案。如果 ID 是后续的,并且中间没有 id 缺失,您可以在自己的 PHP 代码中生成一个以逗号分隔的随机数列表 - 然后使用 SELECT * FROM table WHERE id IN(5,3,1); 查询。

    在另一个 Stack Overflow 问题中,这是一个可行的解决方案: How can i optimize MySQL's ORDER BY RAND() function?

    为我工作,为包含 229,291 条记录的表设置 50 行(0.09 秒)。

    【讨论】:

      【解决方案3】:

      您可以尝试在 php 循环中执行此操作,但我怀疑它会更快..

      $iMaxID = getMaxIdFromYourTable(); //not real php
      $records = array();
      while (true) {
          $iRandID = rand(1,$iMaxID);
          thisRecord = "SELECT FROM yourtable WHERE id = $iRandID";
          if (numrows > 0) {
              $records[] = thisRecord;
              if (count($records) > 50) {
                  break;
              }
          }
      }
      

      【讨论】:

      • 它可以适用于1-5个产品,但对于50-100个它会对性能产生很大影响
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2013-12-25
      • 2013-03-05
      相关资源
      最近更新 更多