注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

MongoDB索引学习

MongoDB 彭东稳 6523次浏览 已收录 0个评论

一、索引介绍

索引就是用来加速查询的,数据库索引与书籍的索引类似:有了索引就不需要翻遍整本书,数据库则可以直接在索引中查找,使得查找速度能提高几个数量级。在索引中找到条目以后,就可以直接跳转到目标文档的位置。

索引是一种特殊的数据结构,该数据结构将收集的数据集的小部分存储在一个易于遍历的表单中。索引存储特定字段或字段的值,该值由该字段的值排序。索引项的排序支持高效的平等匹配和基于范围的查询操作。此外,MongoDB可以返回排序结果采用排序的索引。在MongoDB索引支持提高查询执行效率,没有索引,MongoDB必须执行采集扫描,即扫描每一个文件的集合。

索引的优点:

1.  大大减少了服务器需要扫描的数据量。

2.  索引可以帮助服务器避免排序或使用临时表。

3.  索引可以将随机I/O转换为顺序I/O

下图说明了一个查询,该查询使用索引来选择和匹配文档:

MongoDB索引学习

另外说一下MongoDB的索引使用BTree索引,对于什么是BTree索引可以去看本博客MySQL索引介绍部分。

二、索引类型

2.1 单键索引

MongoDB完整支持对集合中文档的任一键建立索引。每个集合默认都有一个 _id 索引,而且应用和用户可以另外添加索引来支持重要的查询和操作。

创建索引

当系统已有大量数据时,创建索引就是个非常耗时的活,这时我们可以在后台执行,只需指定“background:true”即可。

查看索引

上例显示出来的一共有2个索引,其中_id是创建表的时候自动创建索引,此索引是不能够删除的。

删除索引

上述命令是用来删除集合中某个索引,如果要想删除集合上的所有索引,就是用如下语法即可:

2.2 复合索引

MongoDB支持复合索引 ,其中每个索引项可以包含有集合中文档的多个键。MongoDB允许复合索引最多31个键,下图是一个具有两个键的复合索引的例子:

创建索引

2.3 多键索引

为了索引一个储存数组的键,MongoDB对数组中的每个元素都添加索引项。当收到查询时,这些多键索引 MongoDB可以利用数组的值返回相应文档作为结果。MongoDB会自动地 决定是否需要创建一个多键索引,如果这个键存储着数组。您不需要显示地指定索引为多键类型。

2.4 空间索引

Mongodb支持地理空间坐标数据的高效查询,随着移动互联网的兴起,地理空间索引也变得越来越流行,如找到离当前位置最近的N个场所。MongoDB提供了一系列的索引和查询机制来处理地理空间信息。

在您存储地理数据和编写查询条件前,首先,您必须选择表面类型,这将被用在计算中。您所选择的类型将会影响您的数据如何被存储,建立的索引的类型,以及您的查询的语法形式。

MongoDB提供了两种表面类型:

球面

如果需要计算地理数据就像在一个类似于地球的球形表面上,您可以选择球形表面来存储数据,这样就可以使用2dsphere索引。您可以按照坐标轴:经度,纬度的方式把位置数据存储为GeoJSON对象。GeoJSON的坐标参考系使用的是WGS84数据。

平面

如果需要计算距离,就像在一个欧几里德平面上,您可以按照正常坐标对的形式存储位置数据并使用2d索引。

创建索引

地理空间索引同样可以由ensureIndex来创建,只不过参数不是1或者-1,而是“2d”:

2.5 文本索引

MongoDB提供的文本索引类型支持搜索集合中的字符串内容。这些文本索引不存储特定的语言停止的话(例如,“”,“一个”,“或”)和干的话,在一个集合中,只存储根词。

2.6 哈希索引

MongoDB中哈希索引会对键的值计算一个哈希值然后索引该哈希值。这个索引支持相等匹配,可能会适合作为某些集合的分片键。哈希索引项中存储的是被索引键的哈希值。哈希函数会折叠子文档并计算整体值的哈希值,但是不支持多键(比如数组)索引。MongoDB可以使用哈希索引来支持相等查询,但是哈希索引不支持范围查询。

您可能无法创建一个带有哈希索引键的复合索引或者对哈希索引施加唯一性的限制。但是,您可以在同一个键上同时创建一个哈希索引和一个递增/递减(例如,非哈希)的索引,这样MongoDB对于范围查询就会自动使用非哈希的索引。

创建索引

三、索引属性

3.1 唯一索引

唯一索引可以让MongoDB拒绝保存那些被索引键的值已经重复的文档,如果希望创建一个唯一索引,请使用db.collection.ensureIndex()方法并将unique选项设置为true

创建索引

创建唯一索引时,如果集合中以及有相同的键,那么创建此索引就会报错。

3.2 稀疏索引

稀疏索引中值存储那些有被索引键的文档的索引项,即使被索引键的值是null也会被索引(译者注:请注意,这里对null的处理和那些特殊索引的默认稀疏特性有细微差别,比如文本索引,2d索引等)。索引会跳过所有不包含被索引键的文档。这个索引之所以称为 “稀疏” 是因为它并不包括集合中的所有文档。与之相反,非稀疏的索引会索引每一篇文档,如果一篇文档不含被索引键则为它存储一个null值。

创建索引

四、使用explain

MongoDB提供了一个Explain命令让我们获知系统如何处理查询请求。利用explain命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性能优化索引。使用explain命令返回查询使用的索引情况,耗时,扫描文档数等等统计信息。

<延伸>

MongoDB索引原理

优化MongoDB复合索引


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (1)or分享 (0)
关于作者:

您必须 登录 才能发表评论!