在索引之上缓慢的MongoDB查询

问题描述 投票:1回答:1

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

此集合具有支持我的查询的索引。该索引具有bellow(String,String和Date)属性,大小仅为15mb。 (在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的一些基本最佳实践吗?您可以给我哪些想法来调查这个问题?

mongodb performance
1个回答
5
投票

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

'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最多会使用一个索引或索引交集来覆盖您的查询+排序(如果有的话)。

© www.soinside.com 2019 - 2024. All rights reserved.