MongoDB_索引

来源:互联网 发布:绝地求生多线程优化 编辑:程序博客网 时间:2024/05/24 22:41
  1. 索引概述

    ① 索引数量:
    在一个特定的集合上,不应该拥有两个以上的索引。对于添加的每一个索引,每次的写操作都将耗费更多的时间。

    ② 索引基数:
    集合中某个字段拥有不同值的数量。应该在基数比较高的键上建立索引。或者至少应该把基数较高的键放在复合索引的前面。

    ③ 何时不应该使用索引:
    结果集在原集合中所占的比例越大(30%),索引的速度就越慢,这时应该考虑不使用索引。

  2. 索引类型

    ① 唯一索引:
    可以确保集合的每一个文档的指定键都有唯一值。
    索引储桶的大小是有限制的,如果一个文档的字段由于太大(大于1024字节)不能包含在索引里,MongoDB不会返回任何错误或警告。

    ② 复合索引:在多个键上建立的索引

    db.speeches.ensureIndex({“age”:1,”username”:-1})

    ③ 复合唯一索引:创建复合唯一索引时,单个键的值可以相同,但所有键的组合值必须是唯一的。对已有的集合上创建唯一索引时可能会失败,因为集合中可能已经存在重复的值了。创建索引时使用“dropDups”选项,如果遇到重复的值,第一个会被保留,之后的重复文档都会被删除。对于比较重要的数据,千万不要使用“dropDups”

    db.people.ensureIndex({“username”:1},{“unique”:true,“dropDups”:true})

    ④ 稀疏索引:希望唯一索引只对包含相应键的文档上生效,这时可以将unique与sparse选项组合在一起使用,创建稀疏索引

    db.people.ensureIndex({“username”:1},{“unique”:true,“sparse”:true} )

    稀疏索引不必是唯一的,只要去掉unique选项,就可以创建一个非唯一的稀疏索引

    ⑤ 多键索引:对于某个索引的键,如果这个键在某个文档中是一个数组,那么这个索引就会被标记为多键索引。

    ⑥ 覆盖索引:
    当一个索引包含用户请求的所有字段,可以认为这个索引覆盖了本次查询,应该优先使用覆盖索引。
    隐式索引:
    如果有一个拥有N个键的索引,那么同时也得到了所有这N个键的前缀组成的索引。

    ⑦ 索引嵌套文档:
    允许深入文档内部,对嵌套字段和数组建立索引。

    db.users.ensureIndex({“loc.city”:1})

    索引数组:
    对数组建立索引,实际上是对数组的每一个元素建立一个索引条目。因此数组索引的代价比单值索引高:对于单次插入、更新或者删除,每一个数组条目可能都需要更新。一个索引中的数组字段最多只能有一个。

    ⑧ TTL索引
    如果一个文档的某个字段,如“lastUpdated”存在并且它的值是日期类型,当服务器时间比文档的“lastUpdated”字段的时间晚expireAfterSecs秒时,文档就会被删除。为了防止活跃的会话被删除,可以在会话上有活动发生时将“lastUpdated”字段的值更新为当前时间。

    db.foo.ensureIndex({“lastUpdated”:1},{“expireAfterSecs”:60*60*24})

    ⑨ 全文本索引
    创建全文本索引的成本特别高。
    MongoDB会使用OR连接查询中的每个词,这是执行全文本查询最有效的方式
    优化全文本搜索:创建一个由其他查询条件前缀和全文本字段组成的复合索引

    ⑩ 地理空间索引

  3. 索引管理

    对于一个集合,每个索引只需要创建一次,所有的数据库索引信息都存储在system.indexs集合中。只能通过ensureIndex或者dropIndexes对其进行操作。

    标识索引:
    索引名称的长度是有限制的,新建复杂索引时可能需要自定义索引名称{“name”:“alphabet”}。调用getLastError就可以知道索引是否成功创建。

    修改索引:
    使用dropIndex命令删除不需要的索引。新建索引时,MongoDB会阻塞所有对数据库的读请求和写请求,一直到索引创建完成。如果希望数据库在创建索引的同时仍然可以处理读写请求,可以在创建索引时指定background选项。在已有的文档上创建索引会比新创建索引在插入文档快一点。

  4. 使用explain() 调用可以查看与查询相关的信息

    hit()强制MongoDB使用特定的索引进行查询
    hint({“$natural”:1})强制做全表扫描,不使用索引

    查询优化器:如果一个索引能够精确匹配一个查询,那么优化器就会使用这个索引。如果有几个索引都适合你的查询,MongoDB会从这些可能的索引子集中为每次查询计划选择一个,这些查询计划是并行执行的,最早返回100个结果的就是胜者,其他的查询计划就会被中止。这个查询计划会被缓存,这个查询接下来都会使用它,直到数据集发生了较大变化。

原创粉丝点击