我希望能夠從數據庫中取回15條左右的記錄。我已經看到,使用WHERE id = rand()
會導致性能問題,因爲我的數據庫變得更大。我所見過的所有解決方案都適用於選擇一個隨機記錄。我想獲得倍數。從mysql數據庫返回隨機行而不使用rand()
有誰知道有效的方法來做到這一點的大型數據庫?
編輯:
進一步編輯和測試:
我使用的MyISAM做了一個非常簡單的表格,一個新的數據庫上。我給了這3個字段:autokey
(無符號自動數字鍵)bigdata
(一個大的斑點)和somemore
(一箇中等的int)。 然後,我將隨機數據應用到表中,並使用Navicat運行一系列查詢。下面是結果:
Query 1: select * from test order by rand() limit 15
Query 2: select *
from
test
join
(select round(rand()*(select max(autokey) from test)) as val from test limit 15) as rnd
on
rnd.val=test.autokey;`
(我試過兩個選擇,選擇不同的和它並沒有明顯的差異)
和:
Query 3 (I only ran this on the second test):
SELECT *
FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 10
FROM test
) vars
STRAIGHT_JOIN
(
SELECT r.*,
@lim := @lim - 1
FROM test r
WHERE (@cnt := @cnt - 1)
AND RAND(20090301) < @lim/@cnt
) i
ROWS: QUERY 1: QUERY 2: QUERY 3: 2,060,922 2.977s 0.002s N/A 3,043,406 5.334s 0.001s 1.260
我想要做更多的行,所以我可以看到查詢3是如何縮放的,但是在這個時候電話,它似乎好像清晰的贏家是查詢2。
我之前包裹了這個測試,並宣佈一個答案,而我擁有所有這些數據和測試環境的搭建,任何人都可以提出任何進一步的測試?
這些可能會有所幫助:http://stackoverflow.com/questions/142242/what-是最好的方式來挑選一個隨機排從一個表在MySQL中,http://stackoverflow.com/questions/1244555/how-can-i-optimize-mysqls- order-by-rand-function,http://stackoverflow.com/questions/1868102/order-by-rand-alternative – 2010-08-03 15:12:06