【问题标题】:Heavy math queries and NoSQL databases繁重的数学查询和 NoSQL 数据库
【发布时间】:2012-03-13 08:52:18
【问题描述】:

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

我需要以 EAV 样式存储数据。具有稀疏索引的文档存储非常适合这一点。这样,我可以针对每个参数的值创建一个索引。查询时,只会触及需要的索引。例如,MongoDB 非常适合这一点。 这是需要#1。

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

第二阶段涉及大量数学,我必须对第一阶段的结果进行计算才能对它们进行排名。这个数学涉及大量使用权力和更简单的操作。然后将结果按排名排序,并将“前 100 名”返回给客户端。 这是需要#3。

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

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

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

【问题讨论】:

  • Couchbase 使用 memcached 二进制协议,键/值读取和写入的典型延迟小于 1 毫秒。对于您的查询,您可能可以使用 Couchbase map reduce 进行数学运算,但我必须更多地了解您的用例。

标签: mongodb memcached couchbase nosql


【解决方案1】:

MongoDB 提供服务器端 javascript 执行,这可能会解决您的一些问题,但恐怕我说不出效率如何。但是,我怀疑您的工作流程受 I/O 限制(您提到了数千条记录),因此最好不要进行客户端处理。当然,基准测试会说出真相,但我提出了另一种解决方案。

你试过Redis吗?它具有强大的排序集,非常适合您的范围和排名查询。此外,下一个版本将引入 LUA 脚本,它可以弥补工作流的 I/O 特性。请记住,Redis 真的超级快。

【讨论】:

  • 一直在看Redis。事实上,这个网站就在上面运行 :) 唯一的问题是 LUA 什么时候发布。
  • 我不能确切地说,但这篇文章会给我们希望:) antirez.com/post/redis-2.6-is-near.html
  • 看起来版本 3 会非常好,但还有一段路要走。您的意思是 Redis 已经对集合(我理解)进行了排序,这些集合非常适合我的范围(我得到的)和排名查询(怎么样?)。我的意思是,Redis 似乎没有在内部进行数学运算,所以仍然会有 I/O 瓶颈。你想到了什么?
  • 嗯,我的意思是 Redis 能够通过 ZRANGE 按索引(排名)或通过 ZRANGEBYSCORE 按分数返回项目。此外,您的数学运算可以在服务器上可能的 LUA 脚本的主体中执行,从而节省带宽。
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多