mongo密集索引與稀疏索引

密集索引

mongodb索引默認是密集型的。在一個有索引的集合里,每個文檔都會有對應的索引項,哪怕文檔中沒有被索引鍵也是如此。例如,給文檔的name字段建索引,而有的文檔并沒有name字段,那么name字段索引里會有null值,可以這樣查詢name為null值的文檔:db.products.find({name: null})。

稀疏索引

在稀疏索引里,只會出現(xiàn)被索引鍵有值的文檔。如果想創(chuàng)建稀疏索引,指定{sparse: true}就可以了。例如,可以像下面這樣在name上創(chuàng)建一個唯一性稀疏索引:

db.products.ensureIndex({name: 1}, {unique: true, sparse: true})

比較

兩種情況下不太適合使用默認的密集型索引:

一種是希望在并非出現(xiàn)在集合所有文檔內(nèi)的字段上增加唯一性索引時。舉例來說,你明確希望在每個產(chǎn)品的sku字段上增加唯一性索引。但是出于某些原因,假設產(chǎn)品在還未分配sku時就加入系統(tǒng)了。如果sku字段上有唯一性索引,而你希望插入多個沒有sku的產(chǎn)品,那么第一次插入會成功,但后續(xù)插入都會失敗,因為索引里已經(jīng)存在一個sku為null的項了。這種情況下密集型索引并不適合,你所需要的是稀疏索引(sparse index)。

另一種適用稀疏索引的情況:集合中大量文檔都不包含被索引鍵。例如,假設允許對電子商務網(wǎng)站進行匿名評論。這種情況下,半數(shù)評論都可能缺少user_id字段,如果那個字段上有索引,那么該索引中一半的項都會是null。出于兩個原因,這種情況的效率會很差。第一,這會增加索引的大小。第二,在添加和刪除帶null值user_id字段的文檔時也要求更新索引。

如果很少(或不會)對匿名評論進行查詢,那么可以選擇在user_id上構建一個稀疏索引。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 轉(zhuǎn)載,覺得這篇寫 SQLAlchemy Core,寫得非常不錯。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,499評論 1 14
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,839評論 0 11
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 去年的秋天 我去找我的兄弟 他跟我說我們倆都太苦 一個迷失在別人的路上 一個走不出自己的夢 我看著他安慰我的表情 ...
    illme閱讀 139評論 0 2