MongoDb复合索引:基于键的顺序的性能

MongoDb文档提供了一个清单项目的例子来解释为什么密钥的顺序对性能有重要意义。

它提供了一个示例数据集:

{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 }
{ "_id" : 2, "item" : "f2", type: "food", quantity: 100 }
{ "_id" : 3, "item" : "p1", type: "paper", quantity: 200 }
{ "_id" : 4, "item" : "p2", type: "paper", quantity: 150 }
{ "_id" : 5, "item" : "f3", type: "food", quantity: 300 }
{ "_id" : 6, "item" : "t1", type: "toys", quantity: 500 }
{ "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 }
{ "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 }
{ "_id" : 9, "item" : "t2", type: "toys", quantity: 50 }
{ "_id" : 10, "item" : "f4", type: "food", quantity: 75 }

它比较了两个相似的复合指标的表现。 注意键的顺序是相反的,以表明这一点:

db.inventory.createIndex( { quantity: 1, type: 1 } )
db.inventory.createIndex( { type: 1, quantity: 1 } )

它使用第一个索引执行查询:

db.inventory.find(
   { quantity: { $gte: 100, $lte: 300 }, type: "food" }
).hint({ quantity: 1, type: 1 }).explain("executionStats")

对于第一个索引,文档指出:

"totalKeysExamined" : 5,
"totalDocsExamined" : 2,

然后,查询第二个索引:

db.inventory.find(
   { quantity: { $gte: 100, $lte: 300 }, type: "food" }
).hint({ type: 1, quantity: 1 }).explain("executionStats")

它显示了结果:

 "totalKeysExamined" : 2,
 "totalDocsExamined" : 2,

最后,它得出结论:

对于此示例查询,复合索引{type:1,quantity:1}比复合索引{quantity:1,type:1}更有效。

我可以看到,如果数据中有很多食品和少量满足数量范围的数据,订单会影响性能, 反之亦然 。 但是,我认为这与文档中提出的观点不同。

有5个项目满足数量要求。 有4种满足型号要求。 我不明白第二指数如何在第一指数中得到2个对5的总和检验。 我看到4个食物。 所以,我的直觉告诉我它是4比5。

希望有一些额外的解释可以消除我的困惑。 我想充分理解复合索引键序的意义。

谢谢。

编辑:

我现在明白了。 它有助于在不同场景下可视化2个列表。

以下是按类型列出的清单,然后是数量:

{ "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 }   
{ "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 } 
{ "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
{ "_id" : 2, "item" : "f2", type: "food", quantity: 100 }
{ "_id" : 5, "item" : "f3", type: "food", quantity: 300 }
{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 }
{ "_id" : 3, "item" : "p1", type: "paper", quantity: 200 }
{ "_id" : 4, "item" : "p2", type: "paper", quantity: 150 }
{ "_id" : 9, "item" : "t2", type: "toys", quantity: 50 }
{ "_id" : 6, "item" : "t1", type: "toys", quantity: 500 }

这里是数量列表,然后键入:

{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 }
{ "_id" : 6, "item" : "t1", type: "toys", quantity: 500 }
{ "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 } 
{ "_id" : 5, "item" : "f3", type: "food", quantity: 300 }
{ "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 }   
{ "_id" : 3, "item" : "p1", type: "paper", quantity: 200 }
{ "_id" : 4, "item" : "p2", type: "paper", quantity: 150 }
{ "_id" : 2, "item" : "f2", type: "food", quantity: 100 }
{ "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
{ "_id" : 9, "item" : "t2", type: "toys", quantity: 50 }

按照Veeram的评论,就像前一个指数一样,我们只需要点击索引一次即可找到所需数量的食物。 一旦我们着陆,我们只是按顺序迭代。 但是,如果我们必须首先查找数量,我们会在其中混合多种不同的类型,因此我们必须跳过其他类型才能获得食物。

链接地址: http://www.djcxy.com/p/57921.html

上一篇: MongoDb Compound Indexes: Performance Based on Order of Keys

下一篇: Index intersection queries performing the same as COLLSCAN