【知识小课堂】4 之 索引
索引類型
???????????????? mongoDB 的索引在存儲結(jié)構(gòu)都是一樣的,但是根據(jù)不同的應(yīng)用需求,還是分成了:唯一索引,稀疏索引,復(fù)合索引
1.唯一索引
??????????? MONGODB 在默認(rèn)建立文檔時,都會自動添加一個:“_id” 字段,而此字段默認(rèn)建立唯一索引;
??????????? 如果我們要使一個鍵值在文檔中唯一,我們就要在此字段建立一個唯一索引,語法如下:
db.users.ensureIndex({account:1},{unique:true})
和其它數(shù)據(jù)庫一樣,唯一索引,此字段是允許值為NULL 的,但只允許有一條。
當(dāng)然,我們也可以在多個字段中建立一個唯一索引:
2.稀疏索引
有這樣一個問題:
如果某個字段,如果它存在,那么必須是唯一,因為 會把null當(dāng)做值,如果定義了唯一索引,那么此字段只能存在一個null值的記錄。
這時我們可以使用以下方法定義這個索引:
當(dāng)然,上面是為了方便理解而舉的一個例子。其實 【稀疏索引】并不是必須是唯一索引。
db.user.ensureIndex({email:1},{”sparese”:true})
我們也看一個 稀疏索引查詢
在文檔的x 鍵建立一個 [稀疏索引]
完成后,我們再來查詢看看:
看到,這時查詢結(jié)果,已排除了 沒有鍵 X 的文檔 _id:0 了。
就是因為在建立索引時,“_id”=0 的文檔,不會包含在索引中。
當(dāng)然,如果你需要查詢到 那些不包含 “x” 的 文檔。你可以使用? hint() 來強制全表或其它索引搜索。
比如我下面的代碼:
全表索引:
3.復(fù)合索引
?復(fù)合索引同樣可用于局部屬性的搜索,但必須依照索引字段順序。比如創(chuàng)建索引字段順序"a,b,c",那么僅對"a,b,c"、"a,b"、"a"查詢有效,而對"b,c"之類的組合無效。上面這段話,在mongodb 也有效。
> db.order_detail.find() { "_id" : 1, "cust_id" : 1, "order_id" : 1, "prod_id" : 1 } { "_id" : 2, "cust_id" : 1, "order_id" : 1, "prod_id" : 2 } { "_id" : 3, "cust_id" : 2, "order_id" : 2, "prod_id" : 2 } { "_id" : 4, "cust_id" : 3, "order_id" : 2, "prod_id" : 1 } { "_id" : 5, "cust_id" : 3, "order_id" : 3, "prod_id" : 3 } > db.order_detail.ensureIndex({cust_id:1,order_id:1})
> db.order_detail.getIndexes() [{"v" : 1, "key" : {"_id" : 1}, "ns" : "test.order_detail","name" : "_id_"}, {"v" : 1, "key" : {"cust_id" : 1,"order_id" : 1}, "ns" : "test.order_detail", "name" : "cust_id_1_order_id_1"}]
上面文檔在建立完成復(fù)合索引后,我們來查詢一下數(shù)據(jù),并看看執(zhí)行計劃:
我指定了一個組合索引中后面一個字段進行查詢可以看到,確實沒用到索引
再來看看下面代碼:
我指定了一個組合索引中 后面一個字段進行查詢,但我增加了一個第一個字段的排序。這時可以看到,它用到索引了。
看來還是有辦法解決復(fù)合索引的缺陷的。
還有辦法:
我指定了一個組合索引中后面一個字段進行查詢,但我使用了指定索引進行查詢。
這時看到,查詢也用到索引了。
但這時因為第一個字段為空值,在進行索引檢索時,肯定會搜索更多的數(shù)據(jù)。
有可能是 fullindexsearch.
但總比全表索搜好吧。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的【知识小课堂】4 之 索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MONGODB 数据库文件读取的优化
- 下一篇: 抽取python 标准库页面生成 mob