我对 Mongo 有一个特殊的问题。我们有一个具有以下结构的 800k 文档集合。{"_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()其中“created”是一个未索引的字段。db.Collection.find({"iden": "343754856", "name": "alan"})并遍历所有记录以根据created.然而,MongoDB 似乎在执行第二个查询时花费了大量时间,而它应该是对 1 的优化。关于这里出了什么问题的任何线索?我们正在使用 Go 库。
1 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
第二个版本怎么可能是第一个版本的优化?
您的第一个查询从 MongoDB 服务器检索一个数字:查询结果的总数。当您的第二个版本获取所有匹配的文档时,您在“客户端”端进行计数。
相信我,MongoDB 可以像在 Go 客户端中一样快地在内部计算结果文档。让 MongoDB 服务器发送结果、获取结果并在客户端解组它们需要更多的时间(取决于很多因素)。
请注意,如果您有一个包含"iden"
and的复合索引"name"
,即使您添加了更多过滤器(如"created"
您的示例),该索引仍可能被使用,但 MongoDB 必须迭代部分结果以应用查询的其余部分。要查看索引是否被使用,请执行以下命令:
db.Collection.find( {"iden": "343754856", "name": "alan", "created": {"$gt": ....} ).explain()
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报
0/150
提交
取消