zoukankan      html  css  js  c++  java
  • 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中文社区

  • 相关阅读:
    .......
    JavaScript在IE和Firefox下的兼容性问题
    锁定库位
    期初数据导入
    AX实施的想法
    Inside Microsoft Dynamics AX 4.0 下载
    移库的问题
    js判断select列表值的函数
    SQL Injection攻击检测工具
    js如何向select选项中插入新值
  • 原文地址:https://www.cnblogs.com/attilax/p/15196897.html
Copyright © 2011-2022 走看看