2013-01-02 32 views
0

我需要重新優化這個查詢是很慢的。的Sql INNER與查詢爲了參加由蘭德

SELECT al.alias_title, al.title, al.hits, al.created_on, 
     u.first_name, u.surname, 
     uf.real_name, uf.user_name, 
     T.guid_id 
FROM album al 
INNER JOIN (SELECT imx.id, aix.album_id, imx.guid_id 
      FROM image imx 
      INNER JOIN album_image aix 
         ON imx.id = aix.image_id 
      ORDER BY FLOOR(RAND() * (SELECT COUNT(1) 
            FROM image))) AS T 
      ON al.id = T.album_id 
LEFT JOIN user u 
      ON al.user_id = al.id 
LEFT JOIN user_flickr uf 
      ON u.id = uf.user_id 
WHERE al.approved ='Yes' 
     AND al.visible ='1' 
GROUP BY T.album_id 
ORDER BY al.title; 

我需要一個隨機圖像來顯示每個畫廊的每次。有許多關係 - 圖像,專輯和專輯圖像。我需要爲每張專輯製作一張隨機圖片,然後按專輯排序。我認爲內部查詢和rand函數非常慢。我看過臨時牌桌,但不確定這是否是最好的選擇。

+1

關於每個畫廊多少圖像有哪些?這是否可以輕鬆處理應用程序? –

+0

您應該從SELECT開始使用EXPLAIN並查看它說了什麼。我發現你在子查詢中使用ORDER BY RAND()。這是非常糟糕的做法。首先,你需要優化這個子查詢。也許,你不需要使用aubquery,可能應該分解。 –

+0

數每畫廊圖像的變化相當可觀的一個可能有一個圖像的另一個畫廊可以有200個圖像 –

回答

1

隨機排序是不是一個好的做法。最好使用LIMIT子句,從應用程序生成一個隨機值(或者甚至可以是一個sql變量),然後請求一條記錄。例如

SELECT * FROM table LIMIT ?, 1; 

OR

SELECT * FROM table LIMIT ?, ?+1; 

PD: 「?」可以是一個變量或輸入參數

+0

爲了我怎麼能工作到這個查詢壽 –

+0

如果省略隨機順序通過查詢更快?因爲它可能是處理圖像數量或其大小的問題。 – ronpy

+0

也許你同意分頁查詢,用戶幾乎看不到超過10張圖像,... – ronpy