2010-11-17 143 views
4

我一直在尋找這個問題的解決方案几天,並找不到任何可以減少運行查詢所花費的時間。MySQL從兩個表中選擇隨機行加入連接

我有2個表:

"product_db": 
unique_id - [index] 
image 
url_title 
status - [index] 

"product_page" 
id 
product_unique_id - [index] 
page_id - [index] 

我想選擇是從product_db隨機圖像,其中狀態=「在線」,產品必須在頁面ID = 3

product_db擁有90,000個產品和product_page有超過150000行。

,我現在使用的查詢是:

SELECT image FROM product_db a, product_page b WHERE b.page_id = 3 AND a.status = 'Online' AND a.unique_id = b.product_unique_id ORDER BY RAND() LIMIT 1

這個查詢需要大約2.3secs運行。網頁加載時間相當長。 我已經嘗試了一些其他查詢,第一次返回從product_page與page_id = 3隨機行,然後查詢product_db(它確實減少了所需的時間),但問題是我無法比較,如果產品是'在線'或不。

回答

6

這是排序,讓你放慢速度。而不是通過隨機排序,只需選擇一個隨機product_db.unique_id

在您的查詢,以取代ORDER BY RAND()

AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db)) 

使用>=代替=的情況下UNIQUE_ID已經從數據庫中刪除。不像rand命令那樣隨機的結果,但查詢將執行得更快。如果你願意,你可以用=運行多個查詢,直到找到結果,它仍然可能比排序所有這些結果更快。

有了一個明確的JOIN這將是:

SELECT product_db.image 
FROM product_db 
JOIN product_page ON product_db.unique_id = product_page.product_unique_id 
WHERE product_page.page_id = 3 
AND product_db.status = 'Online' 
AND product_db.unique_id >= ROUND(RAND()*(SELECT MAX(unique_id) FROM product_db)) 
LIMIT 1 
+0

嗨,我只是嘗試這樣的查詢並返回一個錯誤: – James 2010-11-17 23:12:51

+0

SELECT映像從product_db一,product_page b WHERE b.page_id = 3 和a.status = '在線' 和a.unique_id = b.product_unique_id AND a.unique_id> = ROUND(RAND()* MAX(a.id)) – James 2010-11-17 23:13:22

+0

#1111 - 組函數的使用無效 我錯過了什麼嗎? – James 2010-11-17 23:14:06

1

問題是,MySQL沒有辦法選擇一個隨機行,所以它檢索所有的產品並對它們進行排序(不必要的)。

您可以編寫一個存儲過程,在MIN和MAX之間隨機選擇一個unique_id,並試圖獲取該產品,直到它獲得一個。您可以對嘗試進行限制。

+0

您好,感謝您的建議。我對存儲過程不是很熟悉,但我一定會研究它! :)再次感謝 – James 2010-11-18 08:37:40

+0

不,請使用alex和webbiedave指出的方法。這很容易,只需要確定的時間。 – AndreKR 2010-11-18 11:46:48