什么是索引
索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分,按字段值排序,支持有效的相等匹配和基于范围的查询操作。索引支持在 MongoDB 中高效地执行查询,如果没有索引,在执行查询操作时 MongoDB 需要遍历整个集合,效率极低。MongoDB 索引使用 B-Tree 数据结构,这与 MySQL 的 B+Tree 不同。
MongoDB 在创建集合的过程中,会在 _id 字段上创建一个唯一的索引,可防止插入相同值,该索引不能被删除。
索引的类型
MongoDB 支持单字段索引与复合索引,同时还支持一些其他索引,例如:
- 地理空间索引:为了支持对地理空间坐标数据的有效查询,MongoDB 提供了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引
- 文本索引:MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词(例如 “the”、“a”、“or”),而将集合中的词作为词干,只存储根词
- 哈希索引:为了支持基于散列的分片,MongoDB 提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支持相等匹配,不支持基于范围的查询
对索引的操作
查看索引
db.collection.getIndexes()
该语句可以返回一个包含集合中的所有索引的数组。
创建索引
在集合上创建索引,语法如下:
db.collection.createIndex(keys,options)
例如,我们对 state 建立一个降序索引
db.testFile.createIndex({"state":-1})
移除索引
我们可以可以移除指定的索引,或移除所有索引,语法如下:
db.collection.dropIndex(index)
例如我们可以删除刚刚创建的索引
db.testFile.dropIndex({"state":-1})
也可以删除所有索引
db.testFile.dropIndexes()
需要注意,_id 的字段的索引是无法删除的,只能删除非 _id字段的索引。
索引的使用
执行计划
我们可以使用执行计划来查看查询的情况(查询耗费的时间、是否基于索引查询),以此分析查询性能。其语法如下:
db.collection.find(query,options).explain(options)
例如我们查看根据 state 查询数据的情况:
db.testFile.find({"state":"401"}).explain()
涵盖的查询
当查询条件和查询的投影仅包含索引字段时,MongoDB 直接从索引返回结果,而不扫描任何文档或将文档带入内存。这些覆盖的查询可以非常有效。