簡體   English   中英

MongoDB復合索引性能

[英]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 field2field1 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM