2012-08-17 42 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。