2010-05-27 24 views
2

我想在我的數據庫中選擇一個隨機行。我看到一個網站上的此解決方案:在SQL數據庫中選擇隨機行

SELECT column FROM table 
ORDER BY RAND() 
LIMIT 1 

此SQL查詢運行,但有人說我這是一個非高性能的查詢。還有其他解決方案嗎?

Thx

+0

供將來參考:RAND()只適用於mysql。 – Maerlyn 2010-05-27 05:09:30

回答

3

它是。你不得不數

SELECT COUNT(*) FROM `table`; 

這與PHP函數mt_rand後(行號)從1獲得隨機到$計數與查詢得到它:

SELECT `column` FROM `table` LIMIT $rand, 1 
+0

好的,謝謝:)另一個問題,無關的發展,我是法國人,我想知道我的英語是否正確,可以理解? – Jensen 2010-05-27 03:24:13

+0

@Jensen:我是俄羅斯%) – zerkms 2010-05-27 03:25:56

+0

oops,出於某種原因,我以爲你問過'mysql'。你是否? :-S – zerkms 2010-05-27 03:28:29

0

有這樣多了很多的討論在this question中包括對不同DBMS的性能影響和策略。

+0

該主題的所有答案都可以分爲兩類。 1. **緩慢**使用RAND()(或DBMS特定的同義詞)或2.在[1,id]範圍內計算一些隨機的id,並找到> =的值。並且這個解決方案給我們提供了不規則的隨機化覆蓋率(例如:1,2,3,4,5,6,7,8,9,1000000000000)。在這種情況下,在99.99%的情況下,您將獲得最新的行。這是**不是真正的均勻隨機** – zerkms 2010-05-27 03:40:00

+0

我認爲這是一個TANSTAAFL的問題。像TABLESAMPLE這樣的方法顯然是爲了提高速度的隨機性(並且是特定於供應商的)。如果你想要追尋真正的隨機性的兔子洞,那麼你正在爲實施挑戰增加一個理論數學問題。 您可以添加一個觸發器,在插入時使用僞隨機數填充列,將大表預分片爲可管理的分片,然後從一個分片中選擇一行rand()limit 1。因此,預先計算一些「假」隨機性。我同意所有這些方法都涉及純度和實用性之間的折衷。 – 2010-05-27 04:06:25