• MongoDB 对索引的创建查询修改删除 附代码


    前言

    对于索引,如果查询的时候没有增加索引,读取数据的时候会通过扫描集合中的所有数据,对应的数据量进行查询会效率特别低,如果增加了索引(类似mysql通过最左前缀以及索引顺序),查询起来会相对查询整个文件要快得多

    1. 函数

    对于mongo的索引有增删改查

    2. 创建索引

    创建索引一般通过db.collection.createIndex(参数)(这个为3.0以上使用),如果3.0以下使用,将其createIndex替换为ensureIndex即可

    对于带什么参数可看以下内容:

    参数描述
    v索引版本号(不设置默认mongo版本号,也可都设置某个数好区分)
    name索引名(string类),无配置通过索引字段名生成(索引顺序)
    unique唯一索引(设置为true),默认为false
    weights该索引相对其他索引权重【1-99999】
    sparse对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
    background建立该索引过程是否会阻塞其他数据库操作,设置为true(不会阻塞),默认为false
    expireAfterSecondsTTL(集合的生存时间,秒为单位)

    创建索引的时候,在索引后面设置value:1 为升序,-1为降序

    对于索引可以分为
    唯一索引(索引具备唯一性,保证数据不会重复出现)
    普通索引
    复合索引(多个字段的匹配查询)

    • 增加唯一索引:db.sdk_log.createIndex({"id":1},{"unique" : true})
    • 增加普通索引:db.sdk_log.createIndex({"id":1})
    • 增加复合索引:db.sdk_log.createIndex({"id":1,"name":1},{background:true})

    成功显示之后会有(类似如下内容,关键字段已使用xxx替代):

    {
            "raw" : {
                    "xxx" : {
                            "createdCollectionAutomatically" : false,
                            "numIndexesBefore" : 4,
                            "numIndexesAfter" : 5,
                            "ok" : 1,
                            "$gleStats" : {
                                    "lastOpTime" : {
                                            "ts" : xx,
                                            "t" : xx
                                    },
                                    "electionId" : ObjectId("xx")
                            }
                    }
            },
            "ok" : 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    通过对应的explain可看到查询过程,具体如下:db.audio_sdk_log.find({"id":10001}).explain()

    通过explain查询是否使用到了索引以及还是全表查询等
    关于这部分细节,可参考mysql的:
    mongo数据库类似mysql,可看我之前的文章:

    3. 查询索引

    查询索引可以通过查询key、详细信息、具体的size

    参数描述
    db.collection.getIndexes()查询该集合的所有索引
    db.collection.getIndexKeys()查询集合中的所有索引键
    db.collection.totalIndexSize()查询集合索引总大小
    db.collection.getIndexSpecs()查询集中各索引详细信息,这个查出来跟db.collection.getIndexes()差不多

    实战中的显示具体如下,通过db.collection.totalIndexSize()查询结果如下:
    在这里插入图片描述

    唯一索引只有一个,查询显示的时候会把所有索引都显示出来
    通过db.collection.getIndexes()以及db.collection.getIndexSpecs()大致信息如下:

    [
            {
                    "v" : 1,
                    "key" : {
                            "id" : 1
                    },
                    "name" : "id_",
                    "ns" : "xxxx.audio_sdk_log"
            },
            {
                    "v" : 1,
                    "unique" : true,
                    "key" : {
                            "id" : 1,
                            "name" : 1
                    },
                    "name" : "id_1_name_1",
                    "ns" : "xxxx.audio_sdk_log"
            },
    
      		....
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    通过db.collection.getIndexKeys()查询结果如下:

    [
            {
                    "id" : 1
            },
    		....
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4. 修改索引

    修改索引类似重建索引,原本通过创建id为正序的索引:db.collection.createIndex({“id”:1})
    将其修改为倒序索引:db.collection.reIndex({"id":-1})

    5. 删除索引

    索引的删除根据 【创建索引的name(如果不配置系统会给你设置)】进行删除
    使用的代码具体如下:

    参数描述
    db.collection.dropIndex(“索引name”)删除该集合的特定索引
    db.collection.dropIndex()删除该集合内所有索引

    删除特定的索引,执行成功会返回ok为1的字段(类似如下内容,关键字段已使用xxx替代):

    {
            "raw" : {
                    "xxxx" : {
                            "nIndexesWas" : 9,
                            "ok" : 1
                    }
            },
            "ok" : 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    2022 年“苹果学者”名单公布,4 位华人学生位列其中
    非谓语动词
    计算机毕业设计Java购物网站设计(源码+系统+mysql数据库+Lw文档)
    项目-五子棋双人对战:游戏房间的管理(5)
    L58.linux命令每日一练 -- 第九章 Linux进程管理命令 -- pgrep和kill
    学生静态HTML个人博客主页【Web大学生网页作业成品】HTML+CSS+JavaScript
    电池充电放电试验标准介绍
    CONTINUOUS CONTROL WITH DEEP REINFORCEMENT LEARNING
    ModStartCMS v7.4.0 公共图片库支持,安全功能升级
    第42期:MySQL 是否有必要多列分区
  • 原文地址:https://blog.csdn.net/weixin_47872288/article/details/126254809