首页 > 数据库 > > mongodb索引漫谈
引用于: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支持多种类型的索引,包括单字段索引、复合索引、多key索引、文本索引等,每种类型的索引有不同的使用场合。
上建立的BId这个索引就是一个定型的例子。
复合索引的场景其实用到比单字段索引要多,或者说是单子段索引的扩充,因为毕竟很少通过单个参数去获取大量数据。
这个索引是比较有意思的,而且它的应用是针对数组,如果为一个数组类型的key建立了索引,实际上是给数组中的每一个元素建立了一条索引。
比如如果进行模糊匹配查询的时候,其实把value的值通过分词保存在数组中,并给这个数组建立索引也是一个很高效的优化方式。
哈希索引(Hashed Index):是指按照某个字段的hash值来建立索引,目前没用到,后面再继续探索。
地理位置索引(Geospatial Index):目前也没用到,但是能很好的解决O2O的应用场景,比如『查找附近的美食』、『查找某个区域内的车站』等。
文本索引(Text Index)能解决快速文本查找的需求,比如有一个博客文章集合,需要根据博客的内容来快速查找,则可以针对博客内容建立文本索引。之前建立过一个全文索引来解决模糊匹配的查询,但是很多结果并不是理想的。
MongoDB除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。
特殊索引,目前就用到了一个稀疏索引。因为毕竟mongodb是以文档存储的,每个文档所包含的属性都是可以不同的,所以再建立索引的时候 稀疏索引往往也会经常用到。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3155740/ ,如需转载,请注明出处,否则将追究法律责任。