2014-10-11 112 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列表中可能存在空白。請參閱文章以獲取更多高級示例