2011-08-31 82 views
1

我目前有一個查詢的隨機記錄是瘋了效率低下,因爲它是由RAND()進行排序並在每次調用時創建一個臨時表。另外,這意味着它不能被緩存。它也加入到另一張表中,這會增加處理時間並使事情變得複雜一點。所以,幫我優化了以下內容:幫我優化查詢隨機記錄

SELECT  listings.id, listings.price, listings.seller_id, sellers.blacklisted 
FROM  listings 
INNER JOIN sellers ON sellers.id = listings.sellers_id 
WHERE  listings.price > 100 
AND  sellers.blacklisted = 0 
ORDER BY RAND() 
LIMIT 4 

的一種方式,開始要對這個是運行一個查詢,返回的可能列表的COUNT(),再進行第二次查詢(或4人,如果它是真正隨機),並在RAND()* COUNT內設置偏移量。

你會如何處理這個問題?

+0

那麼如何緩存隨機記錄? – NullUserException

+0

這是如何創建臨時表? – Raider

+0

隨機選擇不能完全緩存,但是,上述語句將選擇所有10,000個列表,然後隨機排序,然後將其限制爲4條記錄。效率極低。 – Tron

回答

1

假設listings被索引的ID:

如果你的ID是一個整數:

SELECT  listings.id, listings.price, listings.seller_id, sellers.blacklisted 
FROM  listings 
INNER JOIN sellers ON sellers.id = listings.sellers_id 
WHERE  listings.price > 100 
AND  sellers.blacklisted = 0 
AND  listings.ID LIKE CONCAT(CEIL(RAND() * 100),'%') 
LIMIT 4 

,如果它是ASCII

SELECT  listings.id, listings.price, listings.seller_id, sellers.blacklisted 
FROM  listings 
INNER JOIN sellers ON sellers.id = listings.sellers_id 
WHERE  listings.price > 100 
AND  sellers.blacklisted = 0 
AND  listings.ID LIKE CONCAT(CHAR(CEIL(RAND() * 100)),'%') 
LIMIT 4 

基本上是我的建議,以加快東西是轉儲按順序排列。任何超過幾條記錄都會增加可測量的開銷。

ps請原諒,如果concat不能在mqsql中以這種方式使用;並不完全確定它是否會起作用。

+0

更好地在ID上使用整數'RAND()? – Gustav

+0

@Gustav,不知道! Rand()給出一個0到1之間的數字;我只是給這個隨機數字做任何事情的機會。這並不重要;只要你擺脫順序。我試圖強制執行主鍵的範圍掃描(我假設)以及加快速度。 – Ben

+0

這是做到這一點的方法。我的意思只是如果ID是一個整數而不是varchar。 – Gustav