美文网首页
mongo密集索引与稀疏索引

mongo密集索引与稀疏索引

作者: sunnyzhu92 | 来源:发表于2017-09-03 16:34 被阅读0次

密集索引

mongodb索引默认是密集型的。在一个有索引的集合里,每个文档都会有对应的索引项,哪怕文档中没有被索引键也是如此。例如,给文档的name字段建索引,而有的文档并没有name字段,那么name字段索引里会有null值,可以这样查询name为null值的文档:db.products.find({name: null})。

稀疏索引

在稀疏索引里,只会出现被索引键有值的文档。如果想创建稀疏索引,指定{sparse: true}就可以了。例如,可以像下面这样在name上创建一个唯一性稀疏索引:

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

比较

两种情况下不太适合使用默认的密集型索引:

一种是希望在并非出现在集合所有文档内的字段上增加唯一性索引时。举例来说,你明确希望在每个产品的sku字段上增加唯一性索引。但是出于某些原因,假设产品在还未分配sku时就加入系统了。如果sku字段上有唯一性索引,而你希望插入多个没有sku的产品,那么第一次插入会成功,但后续插入都会失败,因为索引里已经存在一个sku为null的项了。这种情况下密集型索引并不适合,你所需要的是稀疏索引(sparse index)。

另一种适用稀疏索引的情况:集合中大量文档都不包含被索引键。例如,假设允许对电子商务网站进行匿名评论。这种情况下,半数评论都可能缺少user_id字段,如果那个字段上有索引,那么该索引中一半的项都会是null。出于两个原因,这种情况的效率会很差。第一,这会增加索引的大小。第二,在添加和删除带null值user_id字段的文档时也要求更新索引。

如果很少(或不会)对匿名评论进行查询,那么可以选择在user_id上构建一个稀疏索引。

相关文章

  • mongo密集索引与稀疏索引

    密集索引 mongodb索引默认是密集型的。在一个有索引的集合里,每个文档都会有对应的索引项,哪怕文档中没有被索引...

  • 密集索引,稀疏索引,聚簇索引,二级索引

    定义 密集索引:文件中的每个搜索码值都对应一个索引值,就是叶子节点保存了整行, innodb只有一个 稀疏索引:文...

  • mongo回顾(四)

    上回聊到mongo索引采用了B树,而且采用的原因。今天具体聊聊mongo中的索引。MongoDB defines ...

  • mongo索引

       不使用索引的查询称为全表扫描。通常来说,应该尽量避免全表扫描,全表扫描的效率非常低。   创建索引: db....

  • Mongo索引-$or

    MongoDB 中索引因为 $or 引发过多次问题,最近又有新发现,所以决定趁此机会,将发现总结在这里。 综述 规...

  • 索引

    索引(一):顺序索引(稠密索引,稀疏索引和B+树索引)_Night_Se7en_新浪博客

  • mongodb索引

    mongodb的速度很大程度上取决于mongo的hash设计,而与此关系最密切的就是mongo的索引。 查看索引 ...

  • Mongodb学习笔记 (五) 之 索引

    索引 索引提高查询速度,降低写入速度。权衡常用的查询字段,不必在太多列上建索引 在mongo中,索引可以按字段升序...

  • clickhouse 稀疏索引

    MergeTree存储结构逻辑示意图 MergeTree表的存储结构中,每个数据分区相互独立,逻辑上没有关联。单个...

  • 2017-12-20

    全文索引 mongodb 中 每个集合只允许创建一个全文索引 全文索引的限制 mongostat 查看mongo运...

网友评论

      本文标题:mongo密集索引与稀疏索引

      本文链接:https://www.haomeiwen.com/subject/gjljjxtx.html