简介

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

注:文中 col 为你自己的集合名

查看索引

getIndexes() 查看集合的所有索引

> db.col.getIndexes()
>

getIndexKeys() 查看集合中的所有索引键

> db.col.getIndexKeys()
>

totalIndexSize() 查看集合中索引的总大小

> db.col.totalIndexSize()
>

getIndexSpecs() 查看集合各索引的详细信息

> db.col.getIndexSpecs()
>

创建索引

MongoDB使用 createIndex() 方法来创建索引。

注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。

语法

createIndex()方法基本语法格式如下所示:

# col 为你自己的集合名
# Key 值为你要创建的索引字段,1 为指定按升序创建索引,-1 按降序来创建索引
> db.col.createIndex(keys, options)
>

createIndex() 接收可选参数,可选参数列表如下:

Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

实例

创建一个普通索引,key表示字段名,1表示升序排序,-1表示降序。

> db.col.createIndex({"title":1})
>

你也可以设置使用多个字段创建聚合索引(关系型数据库中称作复合索引)。

> db.col.createIndex({"title":1,"description":-1})
>

在后台创建索引,通过在创建索引时加 background:true 的选项,让创建工作在后台执行

> db.col.createIndex({open: 1, close: 1}, {background: true})
>

在后台创建索引的原因:

在前台创建索引期间会锁定数据库,会导致其它操作无法进行数据读写,在后台创建索引,会定期释放写锁,从而保证其它操作的运行,但是后台操作会在耗时更长,尤其是在频繁进行写入的服务器上。

更新索引

reIndex() 重建索引

# 在title字段上建立一个正序索引
> db.col.createIndex({"title":1})
>
# 然后在title字段上重建倒序索引
> db.col.reIndex({"title":-1})
>
# 可以看到重建索引是把之前title字段的索引删掉再新建一个索引的
> db.col.getIndexSpecs()
>

删除索引

dropIndex() 删除集合指定的索引

> db.col.dropIndex("索引名称")
>

dropIndexes() 删除集合全部的索引

> db.col.dropIndexes()
>

mongodb 查看、创建、修改、删除索引的更多相关文章

  1. ElasticSearch.net NEST批量创建修改删除索引完整示例

    本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...

  2. MySQL查看、创建和删除索引的方法

    本文实例讲述了MySQL查看.创建和删除索引的方法.分享给大家供大家参考.具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别 ...

  3. Linux创建修改删除用户和组

    Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...

  4. oracle11g创建修改删除表

    oracle11g创建修改删除表 我的数据库名字: ORCL         密码:123456 1.模式 2.创建表 3.表约束 4.修改表 5.删除表 1.模式 set oracle_sid=OR ...

  5. MySQL进阶11--DDL数据库定义语言--库创建/修改/删除--表的创建/修改/删除/复制

    /*进阶 11 DDL 数据库定义语言 库和表的管理 一:库的管理:创建/修改/删除 二:表的管理:创建/修改/删除 创建: CREATE DATABASE [IF NOT EXISTS] 库名; 修 ...

  6. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  7. PostgreSQL 查询、创建、删除索引

    --查询索引 select * from pg_indexes where tablename='tab1'; --创建索引 tab1_bill_code_index 为索引名, create ind ...

  8. oracle创建、删除索引等操作

    1.创建索引 create index 索引名 on 表名(列名); 2.删除索引 drop index 索引名; 3.创建组合索引 create index 索引名 on 表名(列名1,,列名2); ...

  9. Linux基础学习-用户的创建修改删除

    用户添加修改删除 1 useradd添加用户 添加一个新用户hehe,指定uid为3000,家目录为/home/haha [root@qdlinux ~]# useradd -u 3000 -d /h ...

  10. MongoDB(二)创建更新删除文档

    插入并保存文档操作 用insert向目标集合插入文档,如果没有_id键则会自动添加.最后自动保存. >db.foo.insert({"bar":"baz" ...

随机推荐

  1. Qt Creator 5.0 发布

    我们很高兴地宣布 Qt Creator 5.0 的发布! 正如4.15 发布博文中所宣布的,我们将切换到语义版本控制方案,因此这是 Qt Creator 很长一段时间以来的第一次主要版本更新!不过不要 ...

  2. Intellij IDEA如何导入 Maven 项目

    Intellij IDEA如何导入 Maven 项目 选择 File->Import Module,选择 Maven 模块路径,如下图所示: 选择"Import module from ...

  3. Windows 系统下 Docker 和 Docker Compose 安装配置:一键部署有来开源项目本地环境

    作者主页: 有来技术 开源项目: youlai-mall vue3-element-admin youlai-boot vue-uniapp-template 仓库主页: GitCode Gitee ...

  4. Diary -「NOI 2022」尘降

      又一次,以这样一种身份来到国赛赛场.起跑线延长出赛场外,我将于此开始又一场已知"无用"的竞技. 虚无中 我的尘埃盲目漂泊摇晃   时间回到数个月前的省选,\(600\) 分的总 ...

  5. x86平台SIMD编程入门(4):整型指令

    1.算术指令 算术类型 函数示例 加 _mm_add_epi32._mm256_sub_epi16 减 _mm_sub_epi32._mm256_sub_epi16 乘 _mm_mul_epi32._ ...

  6. CudaSPONGE与PySAGES初步性能测试

    技术背景 在前面的一篇博客中,我们介绍过CudaSPONGE的基础使用方法.CudaSPONGE调用Python接口函数以及CudaSPONGE结合增强采样软件PySAGES的使用方法.在这篇文章中, ...

  7. 一个 .NET 开源、免费、功能强大的Windows应用卸载神器

    前言 今天大姚给大家分享一个基于 .NET 开源(Apache License).免费.功能强大的Windows应用卸载神器:Bulk Crap Uninstaller. 项目介绍 Bulk Crap ...

  8. 基于Java语言的开源能管平台才是最适合国内的能源管理平台

    在"双碳"战略背景下,能源管理已成为政府.企业实现可持续发展的必经之路.面对市场上各类能源管理平台,为何基于Java语言的开源解决方案才是最佳选择?本文将为您揭晓答案,并向您推荐我 ...

  9. Doris端口列表

    实例名称 端口名称 默认端口 通讯方向 说明 BE be_port 9060 FE --> BE BE 上 thrift server 的端口,用于接收来自 FE 的请求 BE webserve ...

  10. OSAL架构

    OSAL操作系统最多可以支持16个任务,由任务功耗管理PwrMgr_task_state变量可知,而OSAL每个任务最多只能支持16个事件处理,理论上最大可以执行256个事件处理. 对于一些运算能力不 ...