在索引之上缓慢的MongoDB查询

1 performance mongodb

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

此集合具有支持我的查询的索引.该索引具有bellow(String,String和Date)属性,大小仅为15mb.(在MongoDB Compass中验证)

{
    "Unit" : 1.0,
    "VendorCode" : 1.0,
    "EmissionDate" : 1.0
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我忘了考虑MongoDB的一些基本最佳实践吗?您可以给我哪些想法来调查这个问题?

Mạn*_*yễn 5

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

'Unit': '016406',
'EmissionDate': {$gte: new ISODate('2018-08-01')}
Run Code Online (Sandbox Code Playgroud)

你想要另一个索引:

{
    "Unit" : 1.0,
    "EmissionDate" : 1.0
}
Run Code Online (Sandbox Code Playgroud)

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

{Unit}
{Unit, VendorCode}
{Unit, VendorCode, EmissionDate}
Run Code Online (Sandbox Code Playgroud)

在此处阅读有关复合索引中前缀的更多信息

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