ORDER BY RAND()函数需要很长时间才能在mysql中执行

时间:2014-10-11 10:42:50

标签: php mysql sql

我必须在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 

4 个答案:

答案 0 :(得分:1)

我去解决方案。

 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

这是解决方案。

由于

答案 1 :(得分:1)

看到这个链接: 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列表中可能存在间隙。有关更多高级示例,请参阅文章

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这非常慢,因为你为表中的每一行分配一个随机值,然后对整个表进行排序,然后将大部分表扔掉。你会好多了:

  1. 检索所有帖子ID;
  2. 在php中随机选择25个;
  3. 查询数据库中的那些行。
  4. 这将以线性时间运行;目前它是O(n log n)

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