我在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的一些基本最佳实践吗?您可以给我哪些想法来调查这个问题?
您的索引不符合您的标准。
'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最多会使用一个索引或索引交集来覆盖您的查询+排序(如果有的话)。