我对Mongo有一个特殊的问题。
我们具有以下结构的80万份文档。
{
"_id" : ObjectId("5bd844199114bab3b2c19fab"),
"u" : 0,
"c" : 0,
"iden" : "343754856",
"name" : "alan",
"email" : "mkasd@abc.com",
"mobile" : "987654321093456",
"expires" : ISODate("2018-11-29T11:44:25.453Z"),
"created" : ISODate("2018-10-30T11:44:25.453Z")
}
我们已经索引了iden
和name
,我们通常在这些索引上查询。
我们尝试了两种查询。
db.Collection.find({“ iden”:“ 343754856”,“ name”:“ alan”,“ created”:
{“ $ gt”:....})。count()
其中“创建的”是未索引字段。
db.Collection.find({“ iden”:“ 343754856”,“ name”:“ alan”})
并遍历所有记录以基于created
进行过滤。
但是,MongoDB在执行第二个查询时似乎要花费大量时间,而这本来应该是对1的优化。
任何人都在想这里出什么问题了吗? 我们正在使用Go库。
答案 0 :(得分:1)
第二个版本如何对第一个版本进行优化?
您的第一个查询从MongoDB服务器检索一个数字:查询结果的总数。当第二个版本获取所有匹配的文档时,则在“客户端”端进行计数。
相信我,MongoDB可以像在Go客户端中一样快地在内部对结果文档进行计数。使MongoDB服务器发送结果,获取结果并在客户端解组它们会花费更多的时间(取决于许多因素)。
请注意,如果您有一个包含"iden"
和"name"
的复合索引,即使您添加了更多过滤器(例如您的示例中的"created"
),该索引仍然可以使用,但是MongoDB必须遍历部分结果才能应用其余查询。要了解是否使用了索引,请执行以下命令:
db.Collection.find(
{"iden": "343754856", "name": "alan", "created": {"$gt": ....}
).explain()