来自RDBMS背景的我总是有这样的印象:"假设一个查询是有效的,尽您所能地使用它",这意味着您向数据库发出的每个请求都是昂贵的.当涉及到MongoDB时,这似乎是不可能的,因为您不能连接表.

我知道它不应该是关系型的,但他们也出于博客、论坛和我觉得RDBMS更容易使用的目的来推动它.

我试图了解MongoDB或NoSQL的总体效率时遇到了一些问题.如果我想要获得与某些用户相关的所有"帖子"(就像他们被分组一样)……使用MySQL,我可能会做一些连接,并由此得到它.

在MongoDB中,假设我需要分离集合,使用大的$in是否有效:[‘user1’,‘user2’,‘user3’,‘user4’,.]?

这种方法会在一段时间后变慢吗?如果我包括1000个用户呢? 如果我需要获取与用户X、Y、Z相关的帖子列表,使用MongoDB是否高效和/或快速:

  • 获取用户数组
  • 获取用户数组中的帖子

对一个请求进行2次查询.这是NoSQL中的糟糕做法吗?

推荐答案

回答关于美元的问题....

我使用以下场景进行了一些性能测试:

~24 million docs in a collection
Lookup 1 million of those documents based on a key (indexed)
Using CSharp driver from .NET

Results:
Querying 1 at a time, single threaded : 109s
Querying 1 at a time, multi threaded : 48s
Querying 100K at a time using $in, single threaded=20s
Querying 100K at a time using $in, multi threaded=9s

因此,使用较大的$in(限制为最 bigquery 大小)时,性能会显著提高.

更新:

Querying 10 at a time (100000 batches) = 8.8s
Querying 100 at a time (10000 batches) = 4.32s
Querying 1000 at a time (1000 batches) = 4.31s
Querying 10000 at a time (100 batches) = 8.4s
Querying 100000 at a time (10 batches) = 9s (per original results above)

因此,在一个$in子句中要批处理多少个值与往返次数之间看起来确实存在一个最佳点.

Database相关问答推荐

为Postgres数据库字段创建复合索引

如何正确创建mongo模型和客户端?

使用 Npgsql 执行年龄查询并在 .NET 应用程序中返回结果?

存储具有公共链接但 ID 很长的用户文件是否安全?

嵌入式的 best数据库是什么?

如何在 ubuntu 中使用脚本添加带有连字符的数据库名称

如何使用错误消息中指定的 tbspaceid tableid 在 DB2 中查找表和列

在事务提交之前传递 JMS 消息

数据验证是否应该在数据库级别进行?

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

Spring 的 JdbcTemplate 是否在查询超时后关闭连接?

锁定机制(悲观/乐观)如何与数据库事务隔离级别相关?

Django中的Atomic原子操作?

连接字符串中超时

如何在一行中显示 redis 中的所有键?

为数据库应用程序留下审计跟踪/更改历史的有效策略?

XML、CSV 或数据库格式的 ICD-9 代码列表

Django:检测数据库后端

如何判断我的 heroku 数据库的记录?

如何使用 liquibase,一个具体的例子