![](/img/trans.png)
[英]How does the order of compound indexes matter in MongoDB performance-wise?
[英]MongoDB compound indexes performance
我在理解復合索引的基本概念時遇到了麻煩。 假設我有一個使用此架構的集合:
{
_id: 1,
field1: 'aaa',
field2: 'bbb',
field3: 'ccc'
}
在https://docs.mongodb.org/manual/core/index-compound/中,它說得很清楚,據我所知,該索引: { field1: 1, field: 2}
僅支持對field1
和二者的查詢field1 AND field2
,這很有意義。
現在,如果我想支持始終使用字段1的所有字段(1、2和3)的查詢,該怎么辦? 我想支持在所有field1 AND field2 AND field3
上查詢field1 AND field2
和field1 AND field3
的選項。
我知道可以為這些查詢選項中的每一個創建復合索引,但是問題是我是否可以使用更少的以相同性能查詢的復合詞。
例如,如果我有一個索引: {field1: 1, field2: 1, field3: 1}
並且我查詢field1 AND field3
,它將使用該索引,但是field2
的索引范圍將是"[MinKey, MaxKey]"
。 創建另一個索引是否值得: {field1: 1, field3: 1}
?
如果嘗試使用這些文檔和索引創建一個集合,然后對查詢進行解釋,則mongo將選擇索引: {field1: 1, field3: 1}
並拒絕其他計划。 這表明mongo發現一個索引優於另一個索引。
例如,explain返回以下內容:
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field3" : 1
},
"indexName" : "field1_1_field3_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field3" : [
"[\"ccc\", \"ccc\"]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"filter" : {
"field3" : {
"$eq" : "ccc"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field2" : 1
},
"indexName" : "field1_1_field2_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field2" : [
"[MinKey, MaxKey]"
]
}
}
},
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"field1" : 1,
"field2" : 1,
"field3" : 1
},
"indexName" : "field1_1_field2_1_field3_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"field1" : [
"[\"aaa\", \"aaa\"]"
],
"field2" : [
"[MinKey, MaxKey]"
],
"field3" : [
"[\"ccc\", \"ccc\"]"
]
}
}
}
]
但是,存在索引大小的問題,以及您將要創建的所有索引是否適合數據庫工作集的RAM。 如果他們不這樣做,它將把索引保存在磁盤上,這將大大降低讀取速度。 最好的折衷辦法可能是在所有三個字段上使用索引,因為這比沒有索引要好,並且涉及的維護少於三個索引
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.