【问题标题】:Slow MongoDB query on top of index索引顶部的慢 MongoDB 查询
【发布时间】:2019-02-10 19:18:49
【问题描述】:

我在 MongoDB 中有一个包含 170 万个文档的集合,每个文档平均大小为 6kb。数据库位于合理的机器中,具有 6Gb 的 RAM 和 4 个内核

这个集合有一个索引来支持我的查询。该索引具有以下属性(字符串、字符串和日期),大小仅为 15 mb。 (在 MongoDB Compass 中验证)

{
    "Unit" : 1.0,
    "VendorCode" : 1.0,
    "EmissionDate" : 1.0
}

但是,当我对集合运行以下查询时,返回需要很长时间。

db.Collection.find({
        'Unit': '016406',
        'EmissionDate': {$gte: new ISODate('2018-08-01')}
    }, {
        'Unit': 1,
        'VendorCode': 1,
        'EmissionDate': 1
    })

根据我使用 SQL 数据库的经验,在这种大小的索引之上的此类查询会立即返回。但是,当我在MongoDB上运行时,通过机器中的shell或者Robo3T,需要10多分钟才能完成!

我的感觉是,当查询找到文档时,出于某种原因,Mongo 正在从存储中检索它。但这只是猜测。

我是否忘记考虑 MongoDB 的一些基本最佳实践?你能给我什么想法来调查这个问题?

【问题讨论】:

  • 欢迎来到 StackOverflow!与其他数据库类似,了解 MongoDB 索引使用的一个很好的起点是Explain your query。使用您的 find(..) 示例,您可以附加 .explain('executionStats') 以查看一些详细信息。如果您不确定如何解释结果,您可以编辑您的问题以包含输出。还请包括您的特定版本的 MongoDB 服务器 (x.y.z),因为行为或可用信息可能存在差异。

标签: mongodb performance


【解决方案1】:

您的索引不符合您的标准。

'Unit': '016406',
'EmissionDate': {$gte: new ISODate('2018-08-01')}

你想要另一个索引:

{
    "Unit" : 1.0,
    "EmissionDate" : 1.0
}

您现有的索引仅支持以下条件:

{Unit}
{Unit, VendorCode}
{Unit, VendorCode, EmissionDate}

阅读更多about the prefix in compound index here

请记住,mongodb 将最多使用一个索引或索引交集来覆盖您的查询 + 排序(如果有)。

【讨论】:

  • 我当前的索引根本不会被使用?
  • 问题描述中的当前查询没有排序,但是当然可以创建一个既支持查询又支持排序的适当索引。请参阅:[使用索引对查询结果进行排序](问题描述中当前查询中没有排序,但您当然可以Use Indexes to Sort Query Results。)和Optimizing Compound Indexes的一些示例。
猜你喜欢
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
相关资源
最近更新 更多