【问题标题】:Is it OK to query a MongoDB multiple times per request?每个请求可以多次查询 MongoDB 吗?
【发布时间】:2011-03-01 16:25:40
【问题描述】:

来自 RDBMS 背景,我一直有这样的印象:“尽量使用一个查询,假设它是有效的”,这意味着您向数据库发出的每一个请求都是昂贵的。对于 MongoDB,这似乎是不可能的,因为您无法连接表。

我知道它不应该是关系型的,但他们也在推动它用于博客、论坛等目的,以及我发现 RDBMS 更容易处理的东西。

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

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

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

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

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

【问题讨论】:

    标签: mysql mongodb database nosql


    【解决方案1】:

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

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

    约 2400 万个文档在一个集合中
    根据键(索引)查找其中的 100 万个文档
    使用 .NET 中的 CSharp 驱动程序

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

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

    更新: 下面从 cmets 介绍 $in 如何处理不同的块大小(多线程查询):

    一次查询 10 个(100000 个批次)= 8.8 秒
    一次查询 100 个(10000 个批次)= 4.32s
    一次查询 1000 个(1000 个批次)= 4.31s
    一次查询10000个(100个批次)= 8.4s
    一次查询100000个(10个批次)= 9s(根据上面的原始结果)

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

    【讨论】:

    • 这里的主要性能差异是每个查询的开销; $in 会更有效率,因为它会往返于服务器以获取结果,而不是 N+M。
    • @AdaTheDev:如果你很容易做到,我认为看看 $in 如何扩展会很有趣,在使用 $in 一次重复“X”的实验的意义上",单线程和多线程,其中 X 是 10,然后是 20,然后是 30,...然后是 100。
    • @Lucas Zamboulis - 请参阅上面的更新。我最终可能会在博客文章中对此做更多的工作,并提供更多详细信息
    • @AdaTheDev:非常感谢 - 虽然结果不是我预期的。如果您确实发表了博客文章,请在此处发表评论。
    • @Martin Grotzke - 全部在本地主机上运行,​​在 Intel Xeon CPU(4 核,8 线程)上。使用 .NET (Parallel.ForEach) 中的任务并行库完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2012-03-18
    • 2015-07-31
    相关资源
    最近更新 更多