【问题标题】:Increase performance for this MongoDB query提高此 MongoDB 查询的性能
【发布时间】:2014-09-24 17:14:43
【问题描述】:

我有一个包含相当大的嵌入式数组的 MongoDB 文档:

name : "my-dataset"
data : [ 
          {country : "A", province: "B", year : 1990, value: 200}
          ... 150 000 more 
       ]

假设我想返回 country == "A" 的数据对象。

  1. 这样做的正确方法是什么,例如通过 NodeJs?

  2. 给定 150 000 个条目和 200 个匹配项,查询大约需要多长时间?

  3. 将数据存储为文档并将名称存储为每个文档的属性会更好(性能/结构方面)吗?

  4. 使用 Mysql 会更有效吗? )

【问题讨论】:

  • 好的。现在在这里喘口气,您实际上在问哪个问题?您是说“文档”有 150,000 个嵌入式数组元素吗?可能不是一个好的设计。试着仔细解释你要做什么,让它听起来像一个问题。该解决方案最有可能使用不同的结构,但正确的答案将解决您需要做的事情,因为您正确解释了它。顺便提一句。仅加粗文本并不能为您提供更好的答案。
  • 4.根据我的经验,在与 mysql 进行性能比较时,结果对于简单查询(如“通过此 ID 找到我的一条记录”)基本相同,而对于更复杂的 sql 查询(使用分组等),使用 mysql 的结果要好一些。(使用 mongo 的聚合框架)对于一些相当大量的数据(0.5 Tb)。似乎更重要的是,mysql 需要 3 倍的磁盘空间来保存完全相同的数据,这间接可能是它更快(更少的磁盘读取)的原因。
  • explain() 是在 mongodb 中分析性能的最佳方式。在docs.mongodb.org/manual/reference/method/cursor.explain/…中查找更多详细信息

标签: node.js mongodb mongodb-query


【解决方案1】:

A) 只需通过查询即可找到它们。

B) 如果复合索引 {name:1, data.country:1} 建立,查询应该很快。但是您将所有数据存储在一个数组中,必须使用 $unwind op。因此,查询可能会很慢。

C) 会更好。如果您将数据存储为:

{country : "A", province: "B", year : 1990, value: 200, name:"my-dataset"}
{country : "B", province: "B", year : 1990, value: 200, name:"my-dataset"}
...

复合索引{name:1, country:1},查询时间

D) MySQL vs MongoDB 1000 reads

【讨论】:

    【解决方案2】:

    1.您可以使用MongoDB聚合:

    db.collection.aggregate([
      {$match: {name: "my-dataset"}},
      {$unwind: "$data"},
      {$match: {"data.country": "A"}}
    ])
    

    将为国家为“A”的每个数据条目返回一个文档。如果要重新组合数据集,请添加 $group 阶段:

    db.collection.aggregate([
      {$match: {name: "my-dataset"}},
      {$unwind: "$data"},
      {$match: {"data.country": "A"}},
      {$group: {_id: "$_id", data: {$addToSet: "$data"}}}
    ])
    

    (没有在合适的数据集上测试它,所以它可能会被窃听)

    2.150000 子文档对于 mongodb 来说仍然不是很多,所以如果你只查询一个数据集,它应该很快(毫秒级)。

    3.只要你确定你的文档会小于 16MB(有点难说),最大 BSON 文档大小),应该没问题,但是如果你存储你的查询会更简单以数据集名称作为属性的数据作为文档,这通常对性能更好。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      相关资源
      最近更新 更多