2014-10-11 173 views
1

我必须使用MYSQL query中的RAND函数。如果我在sql查询中使用这个函数,那么这需要大约0.7962秒。但如果我没有使用它,那么这个工作在0.0009秒内就可以完成。如何使用RAND函数更快地进行sql查询。ORDER BY RAND()函数花费很长时间在mysql中执行

我的查询

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 
+0

请参阅此文章http://explainextended.com/2009/03/01/selecting-random-rows/ – Girish 2014-10-11 10:48:01

+0

您是否在“冷”服务器上没有'ORDER BY'的查询时间?听起来像从缓存中获得结果的时间为0.0009秒。 – dasblinkenlight 2014-10-11 10:48:07

回答

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

这里是解决方案。

感谢

0

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

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

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

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

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 

这个假设是IDS的分布是相等的,而id列表中可能存在空白。请参阅文章以获取更多高级示例