MongoDB——索引简介

159 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

什么是索引?能解决什么问题?

索引是一种用来快速查询数据的数据结构。索引主要是解决慢查询的问题。

举个例子,假设我们需要查找所有yun字?

在新华字典中,如果一页一页的查找,那我们最终需要将整本书都看一遍,这样很会花费大量的时间。

我们需要在更短的时间查找出来,如果我们通过目录来查找,然后目录是按照音序有序,就可以在很短时间找到具体信息。

mongodb中,新华字典就好比collection,如目录就相当于时索引。如果不是用索引,当我们查询时,则会扫描整个collection,这意味着document不断扩大的过程中,我们不得不搜索更多的document来满足我们的查询。时间复杂度则为O(N)。但我们可以做的更好,使用索引,限制我们的搜索空间,而不是搜索全部。

我们可以将索引看作键值对列表, key是字段值, valuedocument 。索引可以是一个或多个字段,这意味着每次创建索引,必须指定是document的某个字段。而且同一个collection可以存在多个索引。

索引数据结构

MongoDB indexes use a B-tree data structure.

官方说:mongodb索引使用的是B树索引数据结构,实际用的是B+树,因为B+树是B树的子集,所以说是B树也没有问题,但是容易误导。

WiredTiger官方文档:

WiredTiger maintains a table's data in memory using a data structure called a B-Tree ( B+ Tree to be specific), referring to the nodes of a B-Tree as pages. Internal pages carry only keys. The leaf pages store both keys and values.

索引开销

当没有索引时,随着数据量对增大,查询时间也随之加长。加入索引给我们带来了更快的查询性能,但是并不是没有开销的。每增加一个索引,会占用一定的空间,同时我们的写入、修改和删除等操作都可能会需要去更新索引(平衡B+树)。

所以我们在创建索引的时候要注意,避免创建一些无用的索引而造成不必要的损失。