Atitit index threod type 索引原理与类型 种类 目录 1.1. 每个文档在经过底层的存储引擎持久化后 1 2. MongoDB索引类型 2 2.1. 包括单字段索引、复合索引

Atitit index threod type 索引原理与类型 种类

 

目录

1.1. 每个文档在经过底层的存储引擎持久化后 1

2. MongoDB索引类型 2

2.1. 包括单字段索引、复合索引、 2

2.2. 多key索引、文本索引等, 2

2.3. 索引通常采用类似btree的结构持久化存储 2

2.4. 复合索引 (Compound Index) 2

3. 其他类型索引 3

3.1. 哈希索引(Hashed Index) 3

3.2. 地理位置索引(Geospatial Index) 3

3.3. 文本索引(Text Index)  fulltext index 3

3.4. Bitmap 3

4. Other 4

4.1.1. 索引额外属性 4

5. Ref 4

 

 

    1. 每个文档在经过底层的存储引擎持久化后

,会有一个位置信息,通过这个位置信息,就能从存储引擎里读出该文档。比如mmapv1引擎里,位置信息是『文件id + 文件内offset 』, 在wiredtiger存储引擎(一个KV存储引擎)里,位置信息是wiredtiger在存储文档时生成的一个key,通过这个key能访问到对应的文档;为方便介绍,统一用pos(position的缩写)来代表位置信息。

比如上面的例子里,person集合里包含插入了4个文档,假设其存储后位置信息如下(为方便描述,文档省去_id字段)

位置信息

文档

pos1

{“name” : “jack”, “age” : 19 }

pos2

{“name” : “rose”, “age” : 20 }

pos3

{“name” : “jack”, “age” : 18 }

pos4

{“name” : “tony”, “age” : 21}

pos5

{“name” : “adam”, “age” : 18}

 

  1. MongoDB索引类型

MongoDB支持多种类型的索引,

    1. 包括单字段索引、复合索引、
    2. 多key索引、文本索引等,

每种类型的索引有不同的使用场合。

 

    1. 索引通常采用类似btree的结构持久化存储

 

如果想加速 db.person.find( {age: 18} ),就可以考虑对person表的age字段建立索引

db.person.createIndex( {age: 1} )  // 按age字段创建升序索引

建立索引后,MongoDB会额外存储一份按age字段升序排序的索引数据,索引结构类似如下,索引通常采用类似btree的结构持久化存储,以保证从索引里快速(O(logN)的时间复杂度)找出某个age值对应的位置信息,然后根据位置信息就能读取出对应的文档。

age

位置信息

18

pos3

18

pos5

19

pos1

20

pos2

21

pos4

 

 

 

    1. 复合索引 (Compound Index)

复合索引是Single Field Index的升级版本,它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推,如下针对age, name这2个字段创建一个复合索引。

    db.person.createIndex( {age: 1, name: 1} ) 

上述索引对应的数据组织类似下表,与{age: 1}索引不同的时,当age字段相同时,在根据name字段进行排序,所以pos5对应的文档排在pos3之前。

age,name

位置信息

18,adam

pos5

18,jack

pos3

19,jack

pos1

20,rose

pos2

21,tony

pos4

复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询,比如db.person.find( {age: 18, name: "jack"} ),也能满足所以能匹配符合索引前缀的查询,这里{age: 1}即为{age: 1, name: 1}的前缀,所以类似db.person.find( {age: 18} )的查询也能通过该索引来加速;但db.person.find( {name: "jack"} )则无法使用该复合索引。如果经常需要根据『name字段』以及『name和age字段组合』来查询,则应该创建如下的复合索引

db.person.createIndex( {name: 1, age: 1} ) 

 

 

  1. 其他类型索引
    1. 哈希索引(Hashed Index)

是指按照某个字段的hash值来建立索引,目前主要用于MongoDB Sharded Cluster的Hash分片,hash索引只能满足字段完全匹配的查询,不能满足范围查询等。

    1. 地理位置索引(Geospatial Index)

能很好的解决O2O的应

用场景,比如『查找附近的美食』、『查找某个区域内的车站』等。

    1. 文本索引(Text Index)  fulltext index

能解决快速文本查找的需求,比如有一个博客文章集合,需要根据博客的内容来快速查找,则可以针对博客内容建立文本索引。

    1. Bitmap

 

  1. Other
      1. 索引额外属性

MongoDB除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。

  • 唯一索引 (unique index):保证索引对应的字段不会出现相同的值,比如_id索引就是唯一索引
  • TTL索引:可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期 或 在某个时间点过期)
  • 部分索引 (partial index): 只针对符合某个特定条件的文档建立索引,3.2版本才支持该特性
  • 稀疏索引(sparse index): 只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况

 

 

  1. Ref

MongoDB索引原理 | MongoDB中文社区

posted @ 2020-08-06 14:10  attilaxAti  阅读(40)  评论(0编辑  收藏  举报