2013-06-01 34 views
-2
SELECT *, (nlike/(nlike + ndlike)) * rand() AS rnk FROM tbl 
order by rnk desc; 

我知道ORDER BY RAND()對性能非常不利,不過,我主要關心的是乘以rand()。這會導致系統變慢嗎?任何替代方案?在MySQL中乘以rand()會影響性能嗎?

+0

'ORDER BY rnk'顯然比'ORDER BY RAND()' – invisal

+0

慢你想實現什麼?隨機排序? –

+0

這基本上是一種算法,給那些沒有機會看到帖子的人提供機會。 –

回答

1

試圖欺騙你的方式將無濟於事。您正在爲每條記錄添加一個新的隨機計算字段,並按此排序,這需要與ORDER BY RAND()完全相同的檢索策略。

+0

那麼沒有其他辦法了?而乘以蘭特()會對性能造成危害嗎? –

+0

乘法與它無關 - 根本沒有時間。需要花費時間的是從數據庫獲取記錄而不使用任何索引,並且當您通過未存儲的內容進行訂購時,它不能使用任何索引。 –

+0

那麼什麼是一個好的解決方案? –

0

大概你試圖用一些數字來限制結果,而不是僅僅命令每個人。

在這種情況下,你可以限制where子句中使用rand()結果,然後選擇基於喜歡/不喜歡公式隨機子集:

select t.* 
from t 
where rand() < 0.01 
order by (nlike/(nlike + ndlike)) desc 

甚至:

order by (nlike/(nlike + ndlike))*rand() desc 

性能增益的關鍵在於您在排序之前減少了數據的大小。對於你的問題,這是一種稍微不同的想法。首先,您正在繪製隨機樣本,然後對其進行排序。

相關問題