可以根据请求多次查询MongoDB吗?

时间:2011-03-01 16:25:40

标签: mysql mongodb database nosql

来自RDBMS的背景,我总是在“尽可能努力地使用一个查询,假设它有效”,这意味着对于您对数据库的每个请求都是昂贵的。当谈到MongoDB时,似乎这可能是不可能的,因为你不能连接表。

我知道它不应该是关系型的,但它们也会推动它用于博客,论坛以及我发现RDBMS更容易接近的目的。

我曾试图了解MongoDB或NoSQL的效率。如果我想获得与某些用户相关的所有“帖子”(就像它们被分组一样)......使用MySQL我可能会做一些连接并得到它。

在MongoDB中,假设我需要将这些集合分开,使用大的$ in是否有效:['user1','user2','user3','user4',...]?

一段时间后,这种方法会变慢吗?如果我包含1000个用户? 如果我需要获得与用户X,Y,Z相关的帖子列表,那么使用MongoDB可以有效和/或快速地执行:

  • 获取用户数组
  • 获取帖子IN用户数组

一个请求的2个查询。在NoSQL中这是不好的做法吗?

1 个答案:

答案 0 :(得分:35)

回答关于$ in ....的问题。

我使用以下方案进行了一些性能测试:

集合中约有2400万个文档 根据密钥(索引)查找100万个这些文档 使用.NET的CSharp驱动程序

结果:
一次查询1个,单线程:109s
一次查询1个,多线程:48s
使用$ in一次查询100K,单线程= 20s
使用$ in,multi threaded = 9s

一次查询100K

使用大的$ in(限制为最大查询大小)显着提高性能。

更新的 继下面的评论关于$ in使用不同的块大小执行(查询多线程):

一次查询10个(100000批次)= 8.8s
一次查询100个(10000批次)= 4.32s
一次查询1000个(1000批次)= 4.31s
一次查询10000个(100批次)= 8.4s
一次查询100000(10批)= 9s(每个原始结果)

因此,对于批量加入$ in子句的数量与往返次数相比,确实存在一个最佳点