MongoDB索引详解

229 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

1、什么是索引?

索引是一种用来快速查询数据的数据结构。B+Tree就是一种常用的数据库索引数据结构, MongoDB采用B+Tree 做索引,索引创建在colletions上。MongoDB不使用索引的查 询,先扫描所有的文档,再匹配符合条件的文档。 使用索引的查询,通过索引找到文档, 使用索引能够极大的提升查询效率。

2、索引的分类

2.1 按照索引包含的字段数量,分为单键索引和组合索引(或复合索引)。

2.2、按照索引字段的类型,分为主键索引和非主键索引。

2.3、按照索引节点与物理记录的对应方式来分,可以分为聚簇索引和非聚簇索引

其中聚簇索引是指索引节点上直接包含了数据记录,而后者则仅仅包含一个指向数据记录的指针。

2.4、按照索引的特性不同,又可以分为唯一索引、稀疏索引、文本索引、地理空间索引等

与大多数数据库一样,MongoDB支持各种丰富的索引类型,包括单键索引、复合索引,唯一索引等一些常用的结构。由于采用了灵活可变的文档类型,因此它也同样支持对嵌套字段、数组进行索引。通过建立合适的索引,我们可以极大地提升数据的检索速度。在一些特殊应用场景,MongoDB还支持地理空间索引、文本检索索引、TTL索引等不同的特性。

3、索引设计原则

1、每个查询原则上都需要创建对应索引

2、单个索引设计应考虑满足尽量多的查询

3、索引字段选择及顺序需要考虑查询覆盖率及选择性

4、对于更新及其频繁的字段上创建索引需慎重

5、对于数组索引需要慎重考虑未来元素个数

6、对于超长字符串类型字段上慎用索引

7、并发更新较高的单个集合上不宜创建过多索引

4、索引的操作

4.1 创建索引

//万能模板
db.collection.createIndex(keys, options);
# 创建索引后台执行
db.values.createIndex({open: 1, close: 1}, {background: true})
# 创建唯一索引
db.values.createIndex({title:1},{unique:true})

4.2 查看索引

#查看索引信息
db.books.getIndexes()
#查看索引键
db.books.getIndexKeys()

4.3 查看索引占用空间

db.collection.totalIndexSize([is_detail]);

is_detail:可选参数,传入除0或false外的任意数据,都会显示该集合中每个索引的大小及总大小。如果传入0或false则只显示该集合中所有索引的总大小。默认值为false。

4.4 删除索引

#删除集合指定索引
db.col.dropIndex("索引名称")
#删除集合所有索引 不能删除主键索引
db.col.dropIndexes()