【问题标题】:ORDER BY RAND() function taking long time to execute in mysql [duplicate]ORDER BY RAND()函数在mysql中执行需要很长时间[重复]
【发布时间】:2014-12-06 11:17:20
【问题描述】:

我必须在MYSQL query 中使用 RAND 函数。如果我在 sql 查询中使用这个函数,那么这大约需要 0.7962 秒。但是,如果我不使用它,那么它可以在 0.0009 秒内正常工作。如何使用 RAND 函数使 sql 查询更快。

我的查询

  SELECT 
         posts.ID,
         posts.post_content, 
         posts.post_title, 
         posts.post_date, 
         posts.post_name 
    FROM posts 
         WHERE posts.post_type = 'post' 
         AND posts.post_status = 'publish' 
    ORDER BY RAND() LIMIT 0, 24 

【问题讨论】:

标签: php mysql sql


【解决方案1】:

rand() 有一些性能“问题” - 这里讨论了一些建议:How can i optimize MySQL's ORDER BY RAND() function?

【讨论】:

    【解决方案2】:

    这非常慢,因为您要为表中的每一行分配一个随机值,然后对整个表进行排序,然后将大部分丢弃。你会过得更好:

    1. 检索所有帖子 ID;
    2. 在php中随机选择其中的25个;
    3. 在数据库中查询这些行。

    这将在线性时间内运行;目前是O(n log n)

    这是迄今为止我见过的允许不均匀分布 ID 的最佳解决方案。如果您的 ID 是连续的(换句话说,如果您永远不会删除任何行),您可以更快地完成此操作。

    【讨论】:

      【解决方案3】:

      我去解决。

       SELECT p1.ID, p1.post_content, p1.post_title, p1.post_date, p1.post_name
           FROM posts as p1 JOIN
                (SELECT CEIL(RAND() *
                       (SELECT MAX(ID)
                          FROM posts)) AS id)
                AS p2
        WHERE p1.ID >= p2.id
        ORDER BY p1.ID ASC
        LIMIT 0, 24
      

      这比我的查询要快。

      MySQL select 10 random rows from 600K rows fast

      这是解决方案。

      谢谢

      【讨论】:

        【解决方案4】:

        查看此链接: http://jan.kneschke.de/projects/mysql/order-by-rand/

        对于大多数一般情况,您可以这样做:

        SELECT name
          FROM random AS r1 JOIN
               (SELECT CEIL(RAND() *
                             (SELECT MAX(id)
                                FROM random)) AS id)
                AS r2
         WHERE r1.id >= r2.id
         ORDER BY r1.id ASC
         LIMIT 1
        

        这假设 id 的分布是相等的,并且 id 列表中可能存在间隙。有关更多高级示例,请参阅文章

        【讨论】:

          猜你喜欢
          • 2020-05-05
          • 1970-01-01
          • 2017-02-18
          • 1970-01-01
          • 1970-01-01
          • 2018-01-01
          • 2011-10-18
          • 1970-01-01
          • 2021-09-19
          相关资源
          最近更新 更多