MongoDB 索引类型介绍

mongodb,索引,类型,介绍 · 浏览次数 : 130

小编点评

**目录** 1.单字段索引 2.复合索引 3.多key索引 4.其他类型索引 5.索引额外属性 6.MongoDB 索引相关的常用sql命令

正文

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 索引类型介绍相似的内容:

MongoDB 索引类型介绍

转载请注明出处: 目录 1.单字段索引 2.复合索引 3.多key索引 4.其他类型索引 5.索引额外属性 6.MongoDB 索引相关的常用sql命令 MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多 key 索引、文本索引等,每种类型的索引有不同的使用场合。 1.单字段索引 语法

MongoDB 中的索引分析

MongoDB 的索引 前言 MongoDB 使用 B 树还是 B+ 树索引 单键索引 创建单键索引 使用 expireAfterSeconds 创建 TTL 索引 复合索引 最左匹配原则 ESR 规则 如何使用排序条件 多键索引 创建多键索引 局限性 哈希索引 注意事项 创建索引 总结 参考 Mo

MongoDB 索引原理与索引优化

转载请注明出处: 1.MongoDB索引 索引通常能够极大的提高查询的效率, 如果没有索引, MongoDB 在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的, 特别在处理大量的数据时, 查询可以要花费几十秒甚至几分钟, 这对网站的性能是非常致命的

ASP.NET 6启动时自动创建MongoDB索引

最近,在使用MongoDB时,碰到这样的一个需求:针对某个Collection手动在开发环境创建了索引,但在测试环境和生产环境不想再手动操作了,于是就想着干脆通过代码的方式在ASP.NET 6应用启动时自动创建,如果是重复创建则直接跳过。

【技术积累】《MongoDB实战》笔记(1)

《MongoDB实战》笔记 第一章 为现代Web而生的数据库 特性 mongodb适合做水平扩展的数据库。 mongodb把文档组织成集合,无schema。 索引 mongodb的二级索引是B树实现。 每个集合最多可以创建64个索引, 副本集 mongodb通过副本集(replication set

MongoDB 强制使用索引 hint

转载请注明出处: 虽然MongoDB 查询优化器一般工作的很不错,但是也可以使用 hint() 来强迫 MongoDB 使用一个特定的索引。在这种方法下某些情形下会提升性能。 一个有索引的 collection 并且执行一个多字段的查询。传入一个制定的索引,强迫查询使用该索引 语法 db_name.

MongoDB安装、基础操作和聚合实例详解

虽然MongoDB这些年很流行,但笔者之前没研究过,现在有需求研究这类NoSQL的数据库,是为了验证其是否可被替换。 MongoDB是很轻量的文档数据库,简单测试也懒得专门准备虚拟机环境了,直接在macOS上安装测试下其基础功能。 1.使用 Homebrew 安装 MongoDB 2.启动/停止 M

MongoDB安全加固,防止数据库攻击删除勒索威胁

前言: 今天发现前段时间自己搭建的一个系统的MongoDB数据找不到了,觉得很奇妙,然后登上MongoDB数据库发现多了一个名为READ__ME_TO_RECOVER_YOUR_DATA的数据库,里面还有一个README的集合里面包含了下面描述的勒索信息。没错我的MongoDB数据库被攻击了,不过还

MongoDB从入门到实战之MongoDB简介

前言 相信很多同学对MongoDB这个非关系型数据库都应该挺熟悉的,在一些高性能、动态扩缩容、高可用、海量数据存储、数据价值较低、高扩展的业务场景下MongoDB可能是我们的首选,因为MongoDB通常能让我们以更低的成本解决问题(包括学习、开发、运维等成本)。接下来的一个月博主将会从基础出发,编写

MongoDB从入门到实战之MongoDB快速入门

前言 上一章节主要概述了MongoDB的优劣势、应用场景和发展史。这一章节将快速的概述一下MongoDB的基本概念,带领大家快速入门MongoDB这个文档型的NoSQL数据库。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战之MongoDB简介👉 MongoDB从入门到实战之Mo