资讯专栏INFORMATION COLUMN

mongo的密集索引与稀疏索引

Invoker / 338人阅读

摘要:密集索引的索引默认都是密集型的。也就是说,在一个有索引的集合里,每个文档都会有对应的索引项,哪怕文档中没有被索引键也是如此。稀疏索引在稀疏索引里,只会出现被索引键有值的文档。这种情况下密集型索引并不适合,你所需要的是稀疏索引。

密集索引

mongo的索引默认都是密集型的。也就是说,在一个有索引的集合里,每个文档都会有对应的索引项,哪怕文档中没有被索引键也是如此。例如,电子商务数据模型里的产品集合,假设你在产品属性category_ids上构建了一个索引。现在假设有些产品没有分配给任何分类,对于每个无分类的产品,category_ids索引中仍会存在像这样的一个null项。可以这样查询null值:db.products.find({category_ids: null})
在查询缺少分类的所有产品时,查询优化器仍然能使用category_ids上的索引定位对应产品。

稀疏索引

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

如何选择

但是有两种情况使用密集型索引会不太方便。

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18931.html

相关文章

  • 《javascript高级程序设计》笔记_数组 稀疏数组 伪数组

    摘要:数组是数据的有序列表,与其他语言不同的是,数组的每一项可以保存任何类型的数据。如下的代码创建的就是一个密集数组稀疏数组与密集数组相反,并不强制要求数组元素是紧密相连的,即允许间隙的存在。 数组是数据的有序列表,与其他语言不同的是,ECMAScript 数组的每一项可以保存任何类型的数据。也就是说,可以用数组的第一个位置来保存字符串,用第二位置来保存数值,用第三个位置来保存对象, 以此类...

    pepperwang 评论0 收藏0
  • 读lodash源码之从slice看稀疏数组密集数组

    摘要:例如其中的为,但是数组中没有元素,是稀疏数组而每个位置都是有元素的,虽然每个元素都为,为密集数组。那稀疏数组和密集数组有什么区别呢在中最主要考虑的是两者在迭代器中的表现。截取并返回新数组为新数组容器。 卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭。 ——北岛《回答》 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行。 本文为读 lodash 源码的第一篇,后续文章会更新到...

    lijy91 评论0 收藏0
  • Tensorflow Python API 翻译(sparse_ops)

    摘要:数据维度是一维,表示输出密集张量的维度。解释这个函数的作用是将稀疏张量的坐标转换成密集张量中的布尔坐标。一个布尔类型的向量,向量长度是,并且其中包含个值。一个布尔类型的向量,数据长度是,如果该行填充了,那么该位置的布尔值为。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/c23... 计...

    BDEEFE 评论0 收藏0
  • Mongo索引学习笔记

    摘要:索引使用场景优加快查询速度劣增删改会产生额外的开销占用空间返回集合中一半以上的数据,全表扫描的效率高索引基础基础操作查看索引创建索引已有大量数据时可后台执行不阻塞删除索引查看索引大小属性索引顺序为正序,为逆序在复合索引中需注意顺序索引属 索引使用场景 优:加快查询速度 劣:增删改会产生额外的开销、占用空间 tips: 返回集合中一半以上的数据,全表扫描的效率高 索引基础 基础操作 查看...

    tianhang 评论0 收藏0
  • Mongo索引学习笔记

    摘要:索引使用场景优加快查询速度劣增删改会产生额外的开销占用空间返回集合中一半以上的数据,全表扫描的效率高索引基础基础操作查看索引创建索引已有大量数据时可后台执行不阻塞删除索引查看索引大小属性索引顺序为正序,为逆序在复合索引中需注意顺序索引属 索引使用场景 优:加快查询速度 劣:增删改会产生额外的开销、占用空间 tips: 返回集合中一半以上的数据,全表扫描的效率高 索引基础 基础操作 查看...

    nihao 评论0 收藏0

发表评论

0条评论

Invoker

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<