2012-08-17 46 views
0

有沒有人有從索引隨機結果獲得+100,000,000(1億)記錄的經驗。獅身人面像。隨機結果有多快?

目標是獲得30個隨機排序結果,每秒至少100次。

其實我的記錄是在MySQL中,但從巨大的表中選擇ORDER BY RAND()是殺死MySQL最簡單的方法。

Sphinxsearch或任何你推薦的東西?

回答

1

我沒有那麼大的索引來嘗試。

[email protected]:~/modules/sphinx-2.0.1-beta/api# time php test.php -i gi_stemmed --sortby @random --select id 
Query '' retrieved 20 of 3067775 matches in 0.081 sec. 
Query stats: 

Matches: 
<SNIP> 

real 0m0.100s 
user 0m0.010s 
sys  0m0.010s 

這是一個相當強大的專用服務器上 - 這是服務現場查詢(〜20qps)


但是,如果你不需要過濾說實話(即每個查詢有一個「WHERE」子句),你可以設置一個返回隨機結果的系統 - 可以通過mysql來完成。只是使用ORDER BY RAND()是邪惡的(和獅身人面像,而更好的排序比mysql仍然做基本相同的事情)。

您的數據如何「稀疏」?如果大多數ID的使用,可以做soemthing像

$ids = array(); 
$max = getOne("SELECT MAX(id) FROM table"); 
foreach(range(1,30) as $idx) { 
    $ids[] = rand(1,$max); 
} 
$query = "SELECT * FROM table WHERE id IN (".implode(',',$ids).")"; 

(可能需要使用隨機()在PHP的結果之後,你likly得到的結果出來的MySQL的編號順序)

哪個更有效率。如果你確實有漏洞,也許只是查找33行。有時會得到更多的需要,(只是丟棄),但你應該仍然獲得大部分時間。

(當然你可以緩存「$最大」的地方,所以它沒有要查找所有的時間。)

否則,你可以設置一個專門的「洗牌」名單。基本上是一個FIFO緩衝區,有一個線程,隨機結果填充(可能使用上述系統,一次使用3000個ID),然後消費者直接從該隊列中讀取隨機結果。

先進先出,使用mysql不是很容易實現,所以也許使用不同的系統 - 也許redis,甚至只是memcache。