• mongo 索引


    MongoDB索引Index
     
    索引支持查询的有效地提高效率。没有索引,MongoDB必须扫描集合的每个文档,以选择与查询语句匹配的文档。这种扫描效率很低,需要 MongoDB 处理大量的数据。
    索引是特殊的数据结构,以易于遍历的形式存储数据集的一小部分。 索引存储特定字段或一组字段的值,按照索引中指定的字段值排序。
     
    索引构建如何影响数据库性能?
    针对已填充集合的MongoDB索引构建,需要针对该集合进行排他性读写锁定。在mongod释放锁定之前需要对集合进行读取或写入锁定的操作必须等待。
    *在版本4.2中进行了更改。
    • 对于功能兼容版本(fcv) "4.2",MongoDB使用优化的构建过程,该过程仅在索引构建的开始和结束时都保留排他锁。其余的构建过程将产生交叉的读写操作。
    • 对于功能兼容版本(fcv) "4.0",默认的前台索引构建过程将保留整个索引构建的互斥锁。background索引在构建过程中不会获得排他锁。
     
      基于副本集的索引具有特定的性能考虑因素和风险。有关更多信息,请参见复制环境中的索引构建。为了最大程度地减少对副本集(包括分片副本集)建立索引的影响,请使用在副本集上建立索引中所述的滚动索引生成过程。
      要返回当前正在运行的索引创建操作的相关信息,请参阅Active Indexing Operations。要在主数据库或独立数据库上终止正在运行的索引创建操作mongod,请使用 db.killOp()。部分构建的索引将被删除。
    不能在副本集的辅助成员上终止复制索引构建。您必须首先在主数据库上删除索引。二级服务器将复制删除操作,并在索引构建完成后删除索引。索引建立和删除之后的所有其他复制将会终止。
     

    在创建索引时,可指定如下选项:

    1) backgroud,值为true或者false
    在后台创建索引,以便构建索引时不会阻止其他数据库操作,默认为false。
     
    2) unique 值为true或者false
    创建唯一索引,默认值为false。
     
    3) name
    指定索引的名称。如果未指定,mongoDB通过连接索引字段的名称和排序顺序来生成索引名称。
     
    4) dropDups 值为true或者false
    创建唯一索引时,如果出现重复删除后续出现的相同索引,只保留第一个,默认值为false。
     
    5) sparse 值为true或者false
    对文档中不存在的字段数据不启用索引,默认值为false。

    创建索引

    要在集合上创建索引,请使用 db.collection.createIndex()方法。创建索引是一种管理性操作

    查看索引

    > db.inventory.getIndexes()
    [
    {
    "v" : 2,
    "key" : {
    "_id" : 1
    },
    "name" : "_id_",
    "ns" : "game.inventory"
    },

    查看查询是否使用索引

    要检查MongoDB如何处理查询,使用 explain()方法。

    如何确定要索引的字段?

    许多因素决定要索引的字段,包括选择性,对多种查询的支持 以及索引的大小。

    查看索引的大小

    db.collection.stats()包括一个为集合中的每个索引提供了大小信息的indexSizes文档。
    根据其大小,一个索引可能无法放入内存。当服务器具有足够的RAM用于索引和其余工作集时,索引将加载进内存。当索引太大而无法放入RAM时,MongoDB必须从磁盘读取索引,这比从RAM读取要慢得多。
    在某些情况下,索引不必完全适合RAM。

    写操作如何影响索引?

    写操作可能需要更新索引:
    • 如果写入操作修改了索引字段,则MongoDB将更新所有键中包含该字段的索引。
    因此,如果应用程序是大量写入操作,则索引可能会影响性能。

    删除索引

    示例:删除名称为name_1的索引
    > db.test.dropIndex("name_1")
    { "nIndexesWas" : 2, "ok" : 1 }
    示例:删除所有索引
    > db.inventory.dropIndexes()
    集合中将_id字段自动设置为索引,删除所有索引时,_id字段的索引不会删除

  • 相关阅读:
    <Ajax> 四. get请求(验证用户名是否存在)
    <Ajax> 三. 前端和后端通过表单数据交互
    <Ajax> 一. PHP基本使用和基本数据类型
    <Ajax> 二. PHP选择语句和循环语句
    <Bootstrap> 学习笔记八. 导航栏和颁
    <Bootstrap> 学习笔记七. 下拉菜单和标签页
    <Bootstrap> 学习笔记六. 栅格系统使用案例
    <Bootstrap> 学习笔记五. 按钮组的使用
    <Bootstrap> 学习笔记三. 浮动的使用
    <Bootstrap> 学习笔记四. 表单组和输入框组的使用
  • 原文地址:https://www.cnblogs.com/fixedstar/p/14215088.html
Copyright © 2020-2023  润新知