MongoDB 索引类型介绍
MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多 key 索引、文本索引等,每种类型的索引有不同的使用场合。
1.单字段索引
语法
db_name.table_Name.createIndex( {field: 1|-1} )
参数
| 名称 | 描述 |
|---|---|
| db_name | 数据库名 |
| table_Name | 集合名 |
| field | 要创建的索引的字段 |
说明
索引字段后面的 1 表示升序索引,-1 表示降序索引,对于单字段索引,升序/降序效果是一样的。
最常见的单字段索引为 id 的默认索引 ,所有mongodb默认都有一个id字段索引,如果我们不指定id的值会自动生成一个ObjectId值。 该id索引是唯一的,并且可以防止客户端对id字段值相同插入两个,
示例如下:
replica:PRIMARY> db.getCollection('operate_log').find();
{ "_id" : ObjectId("6052e8bbe4b0680bbfb5e26b"), "operateType" : 1, "operateResult" : 1 }
{ "_id" : ObjectId("60542024e4b0368d0812be68"), "operateType" : 1, "operateResult" : 1 }
{ "_id" : ObjectId("60542024e4b0368d0812be6a"), "operateType" : 1, "operateResult" : 1 }
{ "_id" : ObjectId("60542057e4b0368d0812be6c"), "operateType" : 1, "operateResult" : 1 }
{ "_id" : ObjectId("605442a2e4b0368d0812be6e"), "operateType" : 1, "operateResult" : 1 }
2.复合索引
语法
db_name.table_Name.createIndex( {field1: 1|-1, field2: 1|-1} )
参数
| 名称 | 描述 |
|---|---|
| db_name | 数据库名 |
| table_Name | 集合名 |
| field1 | 要创建的索引的字段 |
| field2 | 要创建的索引的字段 |
说明
它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序。
比如,我们创建如下复合索引:
db.person.createIndex( {age: 1, name: 1} )
上述索引对应的数据组织类似下表,与 {age: 1} 索引不同的时,当 age 字段相同时,再根据 name 字段进行排序,所以 pos5 对应的文档排在 pos3 之前。
| AGE,NAME | 位置信息 |
|---|---|
| 18,adam | pos5 |
| 18,jack | pos3 |
| 19,jack | pos1 |
| 20,rose | pos2 |
| 21,tony | pos4 |
复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询,比如 db.person.find( {age: 18, name: “jack”} ),也能满足所以能匹配符合索引前缀的查询,这里 {age: 1} 即为 {age: 1, name: 1} 的前缀,所以类似 db.person.find( {age: 18} ) 的查询也能通过该索引来加速。
但 db.person.find( {name: “jack”} ) 则无法使用该复合索引。如果经常需要根据 name 字段以及 name 和 age 字段组合来查询,则应该创建如下的复合索引:
db.person.createIndex( {name: 1, age: 1} )
除了查询的需求能够影响索引的顺序,字段的值分布也是一个重要的考量因素,即使 person 集合所有的查询都是 name 和 age 字段组合(指定特定的 name 和 age),字段的顺序也是有影响的。
age 字段的取值很有限,即拥有相同 age 字段的文档会有很多;而 name 字段的取值则丰富很多,拥有相同 name 字段的文档很少;显然先按 name 字段查找,再在相同 name 的文档里查找 age 字段更为高效。
3.多key索引
语法
db_name.table_Name.createIndex( {field: 1|-1} )
参数
| 名称 | 描述 |
|---|---|
| db_name | 数据库名 |
| table_Name | 集合名 |
| field | 要创建的索引的字段,这里的 field 可以是数组类型 |
说明
当索引的字段为数组时,创建出的索引称为多 key 索引,多 key 索引会为数组的每个元素建立一条索引,比如 person 表加入一个 habbit 字段(数组)用于描述兴趣爱好,需要查询有相同兴趣爱好的人就可以利用 habbit 字段的多 key 索引。
比如如下代码:
{"name" : "jack", "age" : 19, habbit: ["football, runnning"]}
db.person.createIndex( {habbit: 1} ) // 自动创建多key索引
db.person.find( {habbit: "football"} )
4.其他类型索引
哈希索引(Hashed Index)是指按照某个字段的 hash 值来建立索引,目前主要用于 MongoDB Sharded Cluster 的 Hash 分片,hash 索引只能满足字段完全匹配的查询,不能满足范围查询等。
地理位置索引(Geospatial Index)能很好的解决 O2O 的应用场景,比如查找附近的美食、查找某个区域内的车站等。
文本索引(Text Index)能解决快速文本查找的需求,比如有一个博客文章集合,需要根据博客的内容来快速查找,则可以针对博客内容建立文本索引。
5.索引额外属性
MongoDB 除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。
| 属性 | 描述 |
|---|---|
| 唯一索引 (unique index) | 保证索引对应的字段不会出现相同的值,比如 _id 索引就是唯一索引 |
| TTL索引 | 可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期或在某个时间点过期) |
| 部分索引 (partial index) | 只针对符合某个特定条件的文档建立索引,3.2 版本才支持该特性 |
| 稀疏索引(sparse index) | 只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况 |
6.MongoDB 索引相关的常用sql命令
# 添加/修改索引
db.users.ensureIndex({name:"text"}); # 删除集合所有索引
db.users.dropIndexes(); # 删除特定索引 (删除id字段升序的索引)
db.users.dropIndex({"id":1}) # 获取集合索引
db.users.getIndexes(); # 重构索引
db.users.reIndex();
MongoDB 索引类型介绍的更多相关文章
- MYSQL里的索引类型介绍
首先要明白索引(index)是在存储引擎(storage engine)层面实现的,而不是在server层面.不是所有的存储引擎支持有的索引类型. 1.B-TREE 最常见的索引类型,他的思想是所有的 ...
- 各种Oracle索引类型介绍
逻辑上:Single column 单行索引Concatenated 多行索引Unique 唯一索引NonUnique 非唯一索引Function-based函数索引Domain 域索引 物理上:Pa ...
- MySQL 常见索引类型介绍
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL 主要索引类型有如下几种: 1.主键索引 2.唯一索引 3.普通索引 4.空间索引 5.全文索引 假设有如下一张 ...
- Python--day47--mysql索引类型介绍
组合索引(联合索引)详讲:组合索引相对索引合并的缺点是 覆盖索引和索引合并不是真实的索引,只是名词: 命中索引,要避免使用哪些:id.nid是主键 email,num()是索引 1,避免使用like ...
- MongoDB索引类型
与关系型数据库一样,合理的使用索引可以大幅提高MongoDB的查询效率,本文介绍基础索引.复合索引.文档索引等几种常用索引的使用. 1. 基础索引与复合索引 1.1 基础索引 创建索引时,可以是一个集 ...
- MongoDB索引原理
转自:http://www.mongoing.com/archives/2797 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下M ...
- MongoDB · 引擎特性 · MongoDB索引原理
MongoDB · 引擎特性 · MongoDB索引原理数据库内核月报原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引?当你抱怨Mong ...
- MongoDB的学习--索引类型和属性
索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field Indexes) 在一个键上创建的索引就是单键索引, ...
- MongoDB索引介绍
MongoDB中的索引其实类似于关系型数据库,都是为了提高查询和排序的效率的,并且实现原理也基本一致.由于集合中的键(字段)可以是普通数据类型,也可以是子文档.MongoDB可以在各种类型的键上创建索 ...
- MongoDB的学习--索引类型和属性(转)
原文链接:MongoDB的学习--索引类型和属性 索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field I ...
随机推荐
- nsis使用URLDownloadToFile下载文件
在Urlmon.dll中有个函数叫URLDownloadToFile,顾名思义,是一个用来下载文件的东西,我们做在线安装或者其他很多时候,往往需要提前下载一些小的文件来配置当前将要安装的程序,遇到这种 ...
- 【编程学习】MATLAB
目录 一.MATLAB基础 1. 学会完成MATLAB的安装与启动 1.1 软件包下载 1.2 安装步骤 2. 矩阵的基本操作与运算 2.1 矩阵的简单输入与操作 2.2 矩阵的基本运算 2.2.1 ...
- 网络工程知识(二)VLAN的基础和配置:802.1q帧;Access、Trunk、Hybrid接口工作模式过程与配置;VLANIF的小实验
介绍-VLAN VLAN(Virtual Local Area Network)即虚拟局域网,工作在数据链路层. 交换机将通过:接口.MAC.基于子网.协议划分(IPv4和IPv6).基于策略的方式划 ...
- el-cascader组件根据最后一级向上找到父级并设置默认值
vue + elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如何向上找出所有父级数 ...
- 如何清除取消KMS激活
1.首先要卸载掉用KMS激活的程序. 2.卸载完成之后,以管理员身份打开命令提示符. 3.依次输入以下命令 slmgr /upk slmgr /ckms slmgr /rearm 输入完成后会显示需要 ...
- clip-path属性深入理解与使用
clip-path CSS 属性可以创建一个只有元素的部分区域可以显示的剪切区域.区域内的部分显示,区域外的隐藏. clip-path的属性值可以是以下几种: 1.inset: 将元素剪裁为一个矩形, ...
- JS 学习笔记 (六) 函数式编程
1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...
- JS学习笔记 (四) 数组进阶
1.基本知识 1.数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中的位置称为索引,以数字表示,以0开始. 2.数组是无类型的.数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的 ...
- .NET 7 中 LINQ 的疯狂性能提升
LINQ 是 Language INtegrated Query 单词的首字母缩写,翻译过来是语言集成查询.它为查询跨各种数据源和格式的数据提供了一致的模型,所以叫集成查询.由于这种查询并没有制造新的 ...
- java学习之Servlet
0x00前言 Servlet就是一个接口我们需要写一个类然后去实现Servlet,就可以被服务器识别到.request是用来接受客户端传过来的参数,respone是用来响应客户端的页面.我们所用的容器 ...