ITPub博客

首页 > 数据库 > > mongodb索引漫谈

mongodb索引漫谈

作者:浪花小雨滴 时间:2020-05-09 12:01:45 0 删除 编辑

前言

引用于:MongoDB索引原理 | MongoDB中文社区

今天来漫谈下mongodb中的索引,大家都知道数据库最有效的优化方案之一,就是创建索引,无论是关系型数据库还是非关系型数据库。

mongodb版本更新的速度还是挺快的,目前版本是3.6了(或者再你看这篇文章的时候已经更新了很多个版本了),现在项目中用的是3.4的。所以通过版本的更新速度来看,说明mongodb的数据库应用市场的广泛度。但是版本无论版本更新多少,都不影响该篇文章的主题。

为什么要用索引?

当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了。当然也不仅仅是MongoDB数据库,几乎所有的数据库。先看一个例子:现在本地有个mongodb的数据,执行命令,

db.news.count()

现在一个集合(news collection)中的文档总数为:

现在文档中有个BId的属性,存储的是Int类型,现在更具BId进行降序排序,并获取10调数据。所以执行命令如下:

db.news.find().sort({BId:-1}).limit(10)

看下会出现什么效果

将会持续很长时间(主要是让数据多点,才明显),为啥会这样呢?因为如果没有索引,需要全表扫描文档,然后再对扫描的结果进行排序。

那给BId创建索引,执行命令:

db.news.creatIndex({BId:1})

注:当数据量比较大的时候再创建索引的话,耗时也是很长的,所以一定要提前制定好索引策略

当创建完后,查看下索引执行命令:

db.news.getIndexes()

返回结果:

/* 1 */
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "gbm-web.news"
    },
    {
        "v" : 2,
        "key" : {
            "BId" : 1.0
        },
        "name" : "BId_1",
        "ns" : "gbm-web.news"
    }
]

然后再执行,上面的查询,将会非常非常非常非常的快。这时再看下索引所占空间的大小,执行命令:

db.news.stats().indexSizes

返回结果:

/* 单位字节 */
{
    "_id_" : 126558208,
    "BId_1" : 61763584
}

然后看下整个数据库的大小,执行命令:

db.news.dataSize()

返回结果:

#单位字节,大概60多个G
68352006906

整体来说,随着数据库的增大,索引占有空间也在增大,所以要合理建立索引。那下面来说说索引类型。

MongoDB索引类型

MongoDB支持多种类型的索引,包括单字段索引、复合索引、多key索引、文本索引等,每种类型的索引有不同的使用场合。

单字段索引 (Single Field Index)

上建立的BId这个索引就是一个定型的例子。

复合索引 (Compound Index)

复合索引的场景其实用到比单字段索引要多,或者说是单子段索引的扩充,因为毕竟很少通过单个参数去获取大量数据。

多key索引 (Multikey Index)

这个索引是比较有意思的,而且它的应用是针对数组,如果为一个数组类型的key建立了索引,实际上是给数组中的每一个元素建立了一条索引。

比如如果进行模糊匹配查询的时候,其实把value的值通过分词保存在数组中,并给这个数组建立索引也是一个很高效的优化方式。

其他类型索引

哈希索引(Hashed Index):是指按照某个字段的hash值来建立索引,目前没用到,后面再继续探索。

地理位置索引(Geospatial Index):目前也没用到,但是能很好的解决O2O的应用场景,比如『查找附近的美食』、『查找某个区域内的车站』等。

文本索引(Text Index)能解决快速文本查找的需求,比如有一个博客文章集合,需要根据博客的内容来快速查找,则可以针对博客内容建立文本索引。之前建立过一个全文索引来解决模糊匹配的查询,但是很多结果并不是理想的。

索引额外属性

MongoDB除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。

  • 唯一索引 (unique index):保证索引对应的字段不会出现相同的值,比如_id索引就是唯一索引
  • TTL索引:可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期 或 在某个时间点过期)
  • 部分索引 (partial index): 只针对符合某个特定条件的文档建立索引,3.2版本才支持该特性
  • 稀疏索引(sparse index): 只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况

特殊索引,目前就用到了一个稀疏索引。因为毕竟mongodb是以文档存储的,每个文档所包含的属性都是可以不同的,所以再建立索引的时候 稀疏索引往往也会经常用到。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3155740/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    40181