MongoDB 復合索引

2021-08-09 11:48:38 字數 3644 閱讀 2823

1、復合索引建立語法

db.collection.createindex( )

同建立單鍵(列)索引一樣,索引建立時需要指定每乙個鍵索引的順序

多個鍵直接用逗號分隔

索引建立語法可以參考:

2、復合索引的一些特性

復合索引可以支援要求匹配多個鍵的查詢

復合索引每乙個鍵的順序非常重要,這將決定該索引在查詢過程中能否被使用到

復合索引支援前導(綴)列索引查詢

不能夠建立基於雜湊索引型別的復合索引

任意復合索引字段不能超過31個

如下圖所示,在集合的userid以及score列上建立乙個復合索引,其中userid為公升序,score為降序 

演示集合資料,可以參考:

.net/leshami/article/details/52672310

//檢視任意的乙個文件

> db.persons

.find().limit(1).pretty()

, "country" : "usa",

"books" : [

"js",

"c++",

"extjs",

"mongodb"]}

//如下示例,我們在集合persons上的name及age鍵上建立復合索引,且2個都為公升序

> db.persons.createindex()

//在上面的示例中索引首先會按照name的值公升序進行排列

//其次是age鍵,在name之後也按照公升序排列

//下面過濾條件僅使用乙個name鍵來檢視執行計畫

> db.persons.find().explain()

, "indexname" : "name_1_age_1",

......"direction" : "forward",

"indexbounds" :

//下面過濾條件僅使用name及age鍵來檢視執行計畫

> db.persons.find().explain()

, "indexname" : "name_1_age_1",

.........

"direction" : "forward",

"indexbounds" :

//下面過濾條件僅使用name及age鍵來檢視執行計畫,但是將age鍵放在name鍵之前

> db.persons.find().explain()

, "indexname" : "name_1_age_1",

.........

.."direction" : "forward",

"indexbounds" :

//下面單獨基於age鍵作為過濾條件進行查詢

> db.persons.find().explain()

},"direction" : "forward"

},"rejectedplans" : [

]..............

"ok" : 1

}

復合索引建立時按公升序或降序來指定其排列方式。對於單鍵索引,其順序並不是特別重要,因為mongodb可以在任一方向遍歷索引

對於復合索引,按何種方式排序能夠決定該索引在查詢中能否被使用到。

//以下內容基於前面在鍵上建立的索引來考察這個復合索引在排序時被使用到的場景

//基於的排序

> db.persons

.find().sort().explain()

, "indexname" : "name_1_age_1",

..........

"direction" : "forward",

"indexbounds" :

//基於的排序

> db.persons

.find().sort().explain()

, "inputstage" : ,

"direction" : "forward"

.........

"ok" : 1

}//基於的排序

> db.persons

.find().sort().explain()

, "inputstage" : ,

"direction" : "forward"

.........

"ok" : 1

}//基於的排序

> db.persons

.find().sort().explain()

, "direction" : "forward"

..........

"ok" : 1

}//基於的排序

> db.persons

.find().sort().explain()

, "direction" : "forward"

..........

"ok" : 1

}//基於的排序

> db.persons

.find().sort().explain()

, "indexname" : "name_1_age_1",

............

"direction" : "backward", //注意,這裡的方向為向後掃瞄

"indexbounds" :

通過上面的不同場景,得出如下:

排序使用到索引的情形

db.persons

.find().sort()

db.persons

.find().sort()

排序未使用到索引的情形

db.persons

.find().sort()

db.persons

.find().sort()

db.persons

.find().sort()

db.persons

.find().sort()

索引字首指的是復合索引的子集

假如存在如下索引

那存在下列索引字首

在mongodb中,下列查詢過濾條件情形中,索引將會被使用到

item欄位

item欄位 + location欄位

item欄位 + location欄位 + stock欄位

item欄位 + location欄位(儘管索引被使用,但不高效)

以下過濾條件查詢情形,索引將不會被使用到

location欄位

stock欄位

location + stock欄位

MongoDB 復合查詢

復合查詢 and 並且 當查詢條件為多個欄位時,就會需要使用多欄位復合條件查詢。在查詢條件中指定多個字段條件,檢索出所有滿足條件的文件資料。eg 查詢person集合中年齡 age 大於30歲,並且名字 name 為 lucy 的資料。db.person.find 復合查詢 or 或 當有多個查詢條...

索引,復合索引

這裡只看btree索引,至於雜湊索引和全文索引本文暫不討論。前言 索引是有效使用資料庫的基礎,但你的資料量很小的時候,或許通過掃瞄整表來訪問資料的效能還能接受,但當資料量極大時,當訪問量極大時,就一定需要通過索引的輔助才能有效地訪問資料。一般索引建立的好壞是效能好壞的成功關鍵。使用innodb作為資...

復合索引 復合索引順序選擇問題

color red b 注意!在較高版本的oracle中不存在下述的問題!b color 復合索引第乙個原則 字首性 prefixing color red 復合索引的字首性是指只有當復合索引的第乙個字段出現在sql語句的謂詞條件中時,該索引才會被用到。如復合索引為 ename,job,mgr 只要...