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();
最新文章
- BZOJ1298[SCOI2009]骰子的学问
- ef操作类
- 【翻译】Windows 10 中为不同设备加载不同页面的3种方法
- 关于http协议详解
- [salesforce] standard button
- 简单的实现QQ通信功能(四)
- |,&;,<;<;,>;>;运算符
- Net分布式系统之六:微服务之API网关
- CDH:5.14.0 中 Hive BUG记录
- qt之数据库对照片的存取
- Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
- 墨水屏 E-Paper module【转】
- C语言--第2次作业
- Debian如何永久添加静态路由
- ios原生项目内嵌u3d工程
- Android 追加写入文件的三种方法
- Luogu2993 FJOI2014 最短路径树问题 最短路树、长链剖分
- cadence allegro 封装原点修改
- 双击打开excel时提示:向程序发送命令时出现问题
- iOS图片缓存
热门文章
- win7升级到win10系统后,node13升级为node16,node版本node-sass版本与不匹配,导致出现npm ERR! ERESOLVE could not resolve
- C++ 右值引用与一级指针
- 【软件学习】如何将Typora中的本地图片上传到博客
- Tensorflow Lite从入门到精通
- win10安装pip
- 9.channels layers
- vs 自定义代码块
- OpenFOAM 编程 | 求解捕食者与被捕食者模型(predator-prey model)问题(ODEs)
- 缺省源&;一些常用的码头
- Day03.2:Java的基础语法