关于mongodb:mongodb-索引

51次阅读

共计 3363 个字符,预计需要花费 9 分钟才能阅读完成。

什么是索引

索引是一种用来不便查问数据的 数据结构

B Tree 就是一种罕用的数据库索引数据结构,MongoDB 采纳 B 树做索引,索引创立在 colletions 上。

咱们能够在这个网站上直观的看到索引的成果

https://www.cs.usfca.edu/~gal…

除了 B 树,均衡二叉树、红黑数、B + 树都能够用来做索引

mongodb 应用索引和不应用索引

  • MongoDB 不应用索引的查问的时候,会先扫描所有的文档,再匹配符合条件的文档。
  • 应用索引的查问,会通过索引找到文档,应用索引可能极大的晋升查问效率

mongodb 中的索引

mongodb 中的索引与多种索引类型,梳理一下看看成果

索引类型 形容 demo
单字段索引 在某一个特定的字段上建设索引
mongoDB 在 ID 上建设了惟一的单键索引,所以常常会应用 id 来进行查问;
在索引字段上进行准确匹配、排序以及范畴查找都会应用此索引;
创立一个倒序的索引
db.users. createIndex({age:-1});
复合索引 在多个特定的属性上建设索引 <br/> 复合索引键的排序程序, 能够确定该索引是否能够反对排序操作;<br/> 在索引字段上进行准确匹配、排序以及范畴查找都会应用此索引, 但与索引的程序 <br/> 无关;<br/> 为了性能思考, 应删除存在与第一个键雷同的单键索引 db.users. createIndex({username:1,age:-1,country:1})
多键索引 在数组的属性上建设索引 <br/> 针对这个数组的任意值的查问都会定位到这个文档, 既多个索引入口或者键值援用 <br/> 同一个文档 db.users.createIndex({favorites.city:1})
空间索引 2 种平面几何的 2d 索引,球面几何的 2dsphere 索引 见后文详解 <br/> 文本索引 反对在汇合中搜寻字符串内容 db.reviews.createIndex({ comments: “text”} )
Hash 索引 不同于传统的 B - 树索引, 哈希索引应用 hash 函数来创立索引 <br/> 在索引字段上进行准确匹配, 但不反对范畴查问, 不反对多键 hash;<br/>Hash 索引上的入口是均匀分布的, 在分片汇合中十分有用 db.users.createIndex({username : ‘hashed’})

如何应用索引

MongoDB 应用 createIndex() 办法来创立索引,createIndex() 办法根本语法格局是这样的

db. 汇合名.createIndex(keys, options)
  • key

    文档类型值为要创立的索引字段,1 为指定按升序创立索引,- 按降序来创立索引指定为 -1。

  • options

文档类型值 MongoDB 中提供了丰盛的属性,比方 background,是否后盾构建索引,

数据量太大时构建索引耗费工夫长,为了不影响业务,能够加上此参数

后盾运行同时还会为其余读写操作让路

  • name

自定义索引名字

mongodb 的索引属性

惟一索引

可确保索引字段不会存储反复值

MongoDB 默认在创立汇合时会在_id 字段上创立惟一索引,例如

db.collection.createIndex({id:1},
  {unique:true}
) 

局部索引

仅索引汇合中合乎指定过滤器表达式的文档

较低的存储需要,索引创立和保护的老本变小,例如

db.restaurants.createIndex({ cuisine: 1, name: 1}, 
  {
    partialFilterExpression:{
      rating:{$gt: 5}
    }
  }
) 

稠密索引

仅索引蕴含具备索引字段的文档,哪怕索引字段蕴含空值,例如

db.addresses.createIndex({ "xmpp_id": 1},
  {sparse: true}
) 

TLL 索引

非凡的单字段索引,在肯定工夫后或在特定工夫主动从汇合中删除文档

这对于日志和会话类的信息很有用。

db.eventlog.createIndex({"lastModifiedDate":1},
   {expireAfterSeconds:3600}
 ) 

不辨别大小写

例如

db.fruit.createIndex({ type: 1},
  {
    collation:{
      locale:'en',
      strength:2
      } 
    }
)

如何治理索引

创立索引

db. 汇合名.createIndex()

查看索引

db. 汇合名.getIndexes()

db. 汇合名.totalIndexSize()

更新索引

db. 汇合名.reIndex()

删除索引

db. 汇合名.dropIndex()

db. 汇合名.dropIndexes()

单字段索引

图片来源于 mongodb 官网

MongoDB 为文档汇合中的任何字段上的索引提供了残缺的反对

默认状况下,所有汇合在_id 字段上都有一个索引,应用程序和用户能够增加额定的索引来反对重要的查问和操作

复合索引

MongoDB 反对复合索引,其中单个索引构造保留对汇合文档中多个字段的援用。

图中能够看到应用了 userid 和 score 的援用,userid 是升序,score 是倒序

在官网上咱们能够看到 mongodb 的每一种索引类型的图解

https://docs.mongodb.com/manu…

  • 单字段索引
  • 合乎索引
  • 多键索引

多键索引,或能够称为数组索引

文档的多个待索引字段是数组,不能创立两个多键值字段的复合索引,复合索引只能蕴含一个字段是多键索引。

MongoDB 是文档型数据库,两个字段为数组,这个状况是能够产生扭转的,比方其中一个为数组,另一个不是数组。

  • 文本索引
  • 通配符索引

MongoDB 反对动静的文档构造,通过通配符索引应用程序能够查问当时未知字段

例如能够这样创立索引

{"userMetadata" : { "likes" : [ "pigs", "cats"] } }
{"userMetadata" : { "dislikes" : "pickles"} }
{"userMetadata" : { "age" : 100} }

能够 通过 $** 来匹配某个字段前面未知的字段

db.userData.createIndex({ "xxx.$**" : 1} )
  • 二维空间

MongoDB 中有两种二维立体索引:2d、geoHaystack。

1、2d,对在二维立体上坐标点为存储的数据应用索引,是 2.2 版本中的坐标对。

2、GeyHaystack 索引是一个非凡的索引,该索引被优化以在较小的区域上返回结

3、GeHaystack 索引进步了应用立体几何图形的查问的性能

例如

立体的坐标咱们能够这样来示意

// 数组模式
location: [-43.856077, 21.848447] 
// 内嵌文档模式,第一个为经度,第二个为纬度,疏忽字段名
location: {field1: -63, field2: 31,6}

空间索引总是稠密的,并且疏忽稠密选项,仅反对简略的二进制比拟

  • hash 索引等等

Hash 索引通过索引字段值的散列来保护索引数据,应用哈希函数来计算索引字段值的哈希,

次要应用在分片键上。须要留神的点:

1、反对任意单字段的 Hash 索引,不能创立多键的 Hash 索引

2、Hash 值会产生碰撞,Hash 索引不能设定为惟一束缚

3、反对相等查问,不反对范畴查问

4、创立 hash 索引的字段也能够创立其余索引

5、hashed 索引不反对不能转换为 64 位整数的浮点值,大于 2 的 53 次方的浮点值

// 创立一个 hash 索引
db. 汇合名.createIndex({ field: "hashed"} )

写在最初

最初梳理一下 应用 mongodb 的注意事项:

  • 对应用程序的查问要有粗浅的了解

确定将要运行的查问的类型,以便能够构建援用这些字段的索引

  • 通过索引来进步查问效率

当索引蕴含该查问扫描的所有字段时,该索引就反对该查问

  • 通过索引对查问后果进行排序

为了反对无效的查问,在指定索引字段的程序和排序程序工夫

  • 确保索引有足够的内存

内存无限的状况下,MongoDB 通过保留最近的值来淘汰老值,mongodb 的索引还是很耗费内存的

  • 应用可能笼罩索引的查问

查问应用索引放大后果范畴,能够限度可能检索的文档数量

总的来说,咱们学习还是从官网动手

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 阿兵云原生,欢送点赞关注珍藏,下次见~

正文完
 0