mongoDB_08索引的操作

索引-Index

索引支持在MongoDB中高效的执行查询。如果没有索引,MongoDB必须执行全部扫描,即扫描集合中的每一个文档,以选择与查询语句匹配的文档,

如果查询存在适当的索引,MongoDB可以用该索引限制必须检查的文档数。


索引是特殊的数据结构,它以易于遍历的形式存储集合数数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。

MongoDB索引使用B树数据结构.(确切的说是B-Tree,Mysql使B+Tree)
  • 索引的类型

    单字段索引

    MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。
    对于单个字段的索引和排序操作,索引键的排序顺序(升序/降序)并不重要,因为MongoDB可以在任何方向上遍历索引。

    复合索引

    MongoDB支持多个字段的用户定义索引,即复合索引(Compound Index)
    复合索引中列出的字段顺序具有重要的意义。(eg:如果复合索引由{userid:1,score:-1}组成,则索引首先按照userid正序排序,然后在每个userid的值内,再按照score倒序排序)

    其它索引

    地理空间索引(Geospatial Index)
    文本索引(Text Indexes)
    哈希索引(Hashed  Indexes)
  • 索引的操作

    • 1:索引的查看
    1:索引的查看
    返回一个集合中所有索引的数组.
    语法:
        db.collection.getIndexes()
    ---------------------------------------------------------------------
    例子:
        查看comment集合中所有的索引情况
        db.comment.getIndexes()
    
    执行:
    > db.comment.getIndexes()
    [
            {
                    "v" : 2,                       #代表索引引擎的版本号是2
                    "key" : {
                            "_id" : 1           #索引被默认加在_id字段,升序方式
                    },
                    "name" : "_id_",               #索引的名称字段名+_
                    "ns" : "articledb.comment"     #存放的命名空间
            }
    ]
    • 2:索引的创建

      在集合上创建索引.
      语法:
          db.collection.createIndex(keys,options)
      
      1:单字段索引例子:对userid字段建立索引
          db.comment.createIndex({userid:1})
      执行:
      > db.comment.createIndex({userid:1})
      {
              "createdCollectionAutomatically" : false,
              "numIndexesBefore" : 1,
              "numIndexesAfter" : 2,
              "ok" : 1
      }
      
      #查看索引是否创建
      > db.comment.getIndexes()
      [
              {
                      "v" : 2,
                      "key" : {
                              "_id" : 1
                      },
                      "name" : "_id_",
                      "ns" : "comment.comment"
              },
              {
                      "v" : 2,
                      "key" : {
                              "userid" : 1
                      },
                      "name" : "userid_1",
                      "ns" : "comment.comment"
              }
      ]
      
      2:复合索引:对userid和nickname同时建立复合(Compound)索引
          db.comment.createIndex({userid:1,nickname:-1})
      
      > db.comment.createIndex({userid:1,nickname:-1})     #:1升序  -1:降序
      {
              "createdCollectionAutomatically" : false,
              "numIndexesBefore" : 2,
              "numIndexesAfter" : 3,
              "ok" : 1
      }
      
      #查看索引
      > db.comment.getIndexes()
      [
              {
                      "v" : 2,
                      "key" : {
                              "_id" : 1
                      },
                      "name" : "_id_",
                      "ns" : "comment.comment"
              },
              {
                      "v" : 2,
                      "key" : {
                              "userid" : 1
                      },
                      "name" : "userid_1",
                      "ns" : "comment.comment"
              },
              {
                      "v" : 2,
                      "key" : {
                              "userid" : 1,
                              "nickname" : -1
                      },
                      "name" : "userid_1_nickname_-1",
                      "ns" : "comment.comment"
              }
      ]
    • 索引的移除

      可以移除指定的索引或者移除所有索引
      1:移除指定的索引
          db.comment.dropIndex(index)
      例子:
          删除comment集合中userid字段上的升序索引
          db.comment.dropIndex({userid:1})
      
      执行:
      > db.comment.dropIndex({userid:1})
      { "nIndexesWas" : 3, "ok" : 1 }
      
      
      2:删除所有索引----  _id_ 索引不会被删除
      db.comment.dropIndexes()
      执行:
      > db.comment.dropIndexes()
      {
              "nIndexesWas" : 2,
              "msg" : "non-_id indexes dropped for collection",
              "ok" : 1
      }
      > db.comment.getIndexes()                  #默认索引不会被删除
      [
              {
                      "v" : 2,
                      "key" : {
                              "_id" : 1
                      },
                      "name" : "_id_",
                      "ns" : "comment.comment"
              }
      ]