有沒有人有從索引隨機結果獲得+100,000,000(1億)記錄的經驗。獅身人面像。隨機結果有多快?
目標是獲得30個隨機排序結果,每秒至少100次。
其實我的記錄是在MySQL中,但從巨大的表中選擇ORDER BY RAND()是殺死MySQL最簡單的方法。
Sphinxsearch或任何你推薦的東西?
有沒有人有從索引隨機結果獲得+100,000,000(1億)記錄的經驗。獅身人面像。隨機結果有多快?
目標是獲得30個隨機排序結果,每秒至少100次。
其實我的記錄是在MySQL中,但從巨大的表中選擇ORDER BY RAND()是殺死MySQL最簡單的方法。
Sphinxsearch或任何你推薦的東西?
我沒有那麼大的索引來嘗試。
[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。