2012-03-13 35 views
3

我有一个非常具体的数据格式和查询需求,我需要知道NoSQL DBs是否适合这种需求。我是而不是问“哪个DB最好”。我对功能感兴趣沉重的数学查询和NoSQL数据库

我需要以EAV风格存储数据。具有稀疏索引的文档商店是完美的。这样我可以创建一个索引来对其每个参数的值。查询时,只会触及所需的索引。例如,MongoDB对此非常完美。 这是需要#1。

该查询分两个阶段。第一个是“WHERE”的一个简单等价物,涉及一系列针对实数的操作< =>。结果可能在成千上万的记录中,但通常会有成千上万的记录。 这是需要#2。

第二阶段涉及重数学,我必须执行阶段1的结果,以便排名他们。这个数学涉及大量使用权力和简单的操作。然后结果按排名排序,并将“前100名”返回给客户。 这是需要#3。

MongoDB是我比较熟悉的唯一的NoSQL数据库,所以我将用它作为参考。我不相信它可以在查询中执行数学运算,即使可能,它也可能会很慢。我相信数学需要在客户端进行(使用C或CUDA)。这意味着数据需要从DB快速传输到客户端。我知道MongoDB有一个本地二进制连接,但是,例如,Couchbase使用REST,我相信这会使数据在大型数据集的数据传输上变慢。

我没有在MongoDB上解决的原因是我需要分布式服务器,例如Couchbase似乎更适合。

因此,我需要一个解决方案,即既可以在内部执行快速数学计算,从而限制要传输的记录数,也可以非常迅速地传输记录,以便可以在客户端上处理这些记录。我明白要知道唯一的方法是测试,但我不知道的是,这个问题是哪些NoSQL DB具有上述功能。

+0

查询是临时的。 – IamIC 2012-03-13 09:46:29

+0

Couchbase讲述了memcached二进制协议,对于键/值的读取和写入,典型的等待时间小于1ms。对于您的查询,您*可能*能够将Couchbase map reduce用于数学运算,但我必须更多地了解您的用例。 – 2012-08-07 20:34:45

回答

1

MongoDB提供服务器端JavaScript执行,这可能会解决您的一些问题,但我恐怕不能说出效率。但是,我怀疑你的工作流程是I/O绑定的(你提到了数千条记录),所以最好不要做客户端处理。当然,基准测试会说实话,但我提出了另一个解决方案。您是否尝试过Redis?它具有强大的排序集合,完全适合您的范围和排名查询。此外,下一个版本将引入LUA脚本,它可以补救您的工作流程的I/O特性。请记住,Redis真的超级快。

+0

我一直在看Redis。事实上,这个网站运行在它上:)唯一的问题是LUA何时发布。 – IamIC 2012-03-13 11:02:14

+0

我无法确切地说,但是这篇文章会给我们希望:) http://antirez.com/post/redis-2.6-is-near.html – hymloth 2012-03-13 11:10:05

+0

看起来版本3会很好,但一种方式。你的意思是说,Redis已经对我的范围(我得到)和排名查询(如何?)进行了排序(我了解)。我的意思是,Redis似乎没有在内部进行数学计算,所以人们仍然会遇到I/O瓶颈。你有什么想法? – IamIC 2012-03-13 16:47:32