MongoDB系列6:MongoDB索引的介绍

2018 年 3 月 11 日 大数据和云计算技术 邓开表

邓开表同学实战MongoDB系列文章,非常不错,赞!大力推荐!

本文是第6篇,主要讲述MongoDB索引的介绍的使用和配置的实战经验,非常值得一看。


前面系列文章:

MongoDB安全实战之Kerberos认证

MongoDB Compass--MongoDB DBA必备的管理工具

MongoDB安全实战之审计

MongoDB安全实战之SSL协议加密

MongoDB安全实战之网络安全加固




1

1、前言

和关系型数据库一样,MongoDB的索引可以提高查询执行效率。索引就好比书中的目录,可以快速定位书中某一页。适当的索引查询,优化器可以快速地返回结果集。

2

 2、MongoDB支持的索引类型

 在MongoDB主要支持以下几种索引类型:

  • ·单列索引

  • ·复合索引

  • ·多键索引

  • ·全文索引

  • ·地理空间索引

  • ·哈希索引

2.1

2.1 单列索引

 MongoDB中,每个集合都会默认创建一个唯一索引列”_id””_id”列是最基本的单列索引。

创建单列索引可以使用以下语法:

db.collection.createIndex( { keyname : -1 } )

这里的keyname表示键名;

-1表示索引值按降序排列;

1表示索引值按升序排列;

创建单列唯一索引使用以下语法:

db.collection.createIndex( {keyname : -1},{“unique” : true})

MongoDB索引默认创建的是B树索引。


2.2

2.2 复合索引 


MongoDB支持在多列上创建索引。

创建复合索引可以使用以下语法:

db.collection.createIndex( { <field1> :<type>,<field2> : <type> , ......} )

例如,集合test,记录如下:

nameage列创建复合索引如下:

db.test.createIndex({ “name” : 1, ”age” : 1 })

:复合索引不能包含哈希索引列。

2.3

2.3 多键索引


如果索引字段的值为数组,MongoDB会创建数组中的每个元素的索引键(即多键索引),不需要明确指定多键型。

和单列索引语法一样,多键索引创建语法如下:

db.collection.createIndex({ <field> : <1 or -1> } )

:哈希索引不能是多键。



2.4

2.4 全文索引


MongoDB提供全文索引支持文本搜索查询字符串内容。全文索引可以是其值为字符串或字符串元素的数组的字段。目前,MongoDB集合最多只支持一个全文索引。


2.4.1 全文索引版本历史

MongoDB 3.2开始,MongoDB全文索引默认的版本为Version3.

MongoDB 2.6开始使用Version 2的全文索引为默认版本,MongoDB2.63.0都使用Version 2.

MongoDB 2.4则只支持Version 1的全文索引。

当创建全文索引时,想覆盖默认版本,可以使用选项{ “2dsphereIndexVersion” : <version> }


2.4.2 全文索引创建与索引名称

创建全文索引语法如下:

db.collection.createIndex( { <fields> : “text” } )

也可以在多列上创建全文索引:

db.collection.createIndex( { <fields1> : “text”,<fields2> : “text”,......} )

全文索引默认名称为“索引列名”加上“_text”,例如:


像上面创建的全文索引,默认的索引名称为content_text_name_text_sex_text

由于索引名称长度的限制,以及删除索引的方便,可以在创建索引给索引命令。

db.test.createIndex({bigdata:”text”,”name”:”text”,”sex”:”text”},{name:”NewTextIndex”})


2.4.3 全文索引的权重

对于全文索引,索引字段的权重表示相对于全文索引中的其他索引字段的重要性。索引列的默认权重为1。调整索引列的权重,可以使用包含weights选项的db.collection.createIndex()方法。

:选择权重时需要注意防止索引重建。

例子,集合blog,文档如下:

现在,创建一个包含三个字段的全文索引,并将权重分配给两个字段:

db.blog.createIndex(

{ content : “text”,keywords : “text”, about:”text” },

{ weights : {content : 10, keywords : 5 }, name: “TextIndex” }

)

则全文索引有以下字段和权重:

·content权重10

·keywords权重5

·about有默认权重1


2.4.4 通配符全文索引

创建多个字段的全文索引时,还可以使用通配符($**)。通配符全文索引,索引每一个包含字符串数据集合中的每个文档。以下是创建一个全文索引使用通配符语法:

db.collection.createIndex({ “$**”:”text” } )

如果不确定哪些文本字段在查询条件中,此类索引是有用的。


2.4.5 不区分大小写

Version 3的全文索引不区分大小写,而早期版本的全文索引只对[A-z]不区分大小写,对于所有其他字符,则视为不同。


2.4.6 全文索引的限制

·一个集合最多支持一个全文索引;

·在一个包含$text的查询表达式中不能用hint()提示;

·排序操作不能从全文索引中获得排序顺序;


2.4.7 存储需求和性能成本

·全文索引可以是大的。它们为每一个插入的文档在每个索引字段中包含一个唯一的索引词。

·构建全文索引与构建一个大型多键索引非常相似,而且相同数据下,比构建一个简单的有序索引要长。

·当在现有集合上构建一个大型全文索引时,确保打开的文件描述符有足够高的限制。

·全文索引会影响插入效率,因为MongoDB必须为每一个新的源文档的每一个唯一索引词添加索引。


2.5

2.5 地理空间索引

 随着移动设备的应用的爆发式增长,有一种查询变得越来越流行:找到离当前位置最近的N个场所。MongoDB为坐标平面查询提供了专门的索引,称作地理空间索引。地理空间索引分2dsphere索引和2d索引。

2.5.1 2dsphere索引

2dsphere索引支持GeoJSON地理空间格式或传统的坐标对格式数据存储。

2dsphere索引创建语法:

db.collection.createIndex({<field> : “2dsphere”} )

这里的field的值必须是GeoJSON对象或传统的坐标对。

例如:下面的places集合,其中loc键是GeoJSON格式数据。

现在loc列,创建一个2d球面索引。

db.places.createIndex( { loc : “2dsphere” } )

查询离[-73.88,40.78]点(即飞机场)最近的10个文档:

db.runCommand( { geoNear : “places”, near : [-73.88,40.78],num : 10})

db.places.find( { “loc” : { $near : [-73.88,40.78]}}).limit(10)

注意事项

·geoNear命令和$geoNear管道要求集合最多只有12dsphere索引或2d索引;而地理空间查询操作(例如,$near$geoWithin)允许集合具有多个地理空间索引。

·2dsphere索引的字段必须是GeoJSON格式数据或传统坐标对格式数据。

·不能在分片的集合中使用片键做2dsphere索引,但是可以在一个分片集合中,使用非片键列创建2dsphere索引。


2.5.2 2d索引

1) 2d索引创建语法:

db.collection.createIndex ( { <location field> : “2d” ,

<additionalfield> : <value> } ,

{<index-specification options> })

其中,<index-specificationoptions>选项可以是下列可选的选项:

{ min : <lower bound> , max : <upper bound>, bits :<bit precision> }

2) 2d索引的位置范围:

默认情况下,2d索引假定经度和纬度,边界为-180180,如果文档中的坐标数据在范围之外,MongoDB就会返回一个错误。

3) 定义2d索引的位置精度:

默认情况下,传统坐标对上的2d索引使用26位精度,大致相当于2英尺或60厘米的精确度,默认范围-180180。精度是衡量大小用来存储位置数据的Geohash值位。可以配置高达32位精度的地理空间索引。

    索引精度不会影响查询精度。实际的网格坐标总是用于最终的查询处理。降低精度的好处使插入操作使用更少空间和处理开销较低。更高精度的一个好处是查询扫描索引的较小部分以返回结果。

配置非默认位置精度,在创建索引时可以使用位选项:

db.collection.createIndex( {<location field> : “<indextype>”},

{ bits: <bit precision> } )

注意事项

·geoNear命令和$geoNear管道要求集合最多只有12dsphere索引或2d索引;而地理空间查询操作(例如,$near$geoWithin)允许集合具有多个地理空间索引。

·如果位置数据是GeoJSON格式数据对象,应使用2dsphere索引,而不是2d索引。

·同样,能在分片的集合中使用片键做2d索引,但是可以在一个分片集合中,使用非片键列创建2d索引。


2.6

2.6 哈希索引

1) 哈希索引的创建语法:

db.collection.createIndex({ _id : “hashed”} )

哈希索引支持分片使用哈希片键。基于分片使用哈希索引的字段作为片键在分片集群分区数据。

在分片集合中,使用哈希索引作为片键结果得到更加随机分布的数据。

2) 哈希函数

哈希索引使用哈希函数来计算的索引字段的值的哈希。哈希函数折叠嵌入式文档并计算整个值的哈希值,但不支持多键(即数组)索引。

注意事项

·MongoDB支持任何单一的列的哈希索引。但不支持多键(即数组)索引。

·不能在哈希索引列或指定哈希索引唯一约束字段上创建复合索引;但是,在同一个字段上,可以创建哈希索引和非哈希索引。MongoDB会使用标量索引范围查询。



猜你喜欢




#大数据和云计算机技术社区#博客精选(2017)

NoSQL 还是 SQL ?这一篇讲清楚

阿里的OceanBase解密

#大数据和云计算技术#: "四有"社区介绍

大数据和云计算技术周报(第27期)

新数仓系列:Hbase周边生态梳理(1)

《大数据架构详解》第2次修订说明

云观察系列:漫谈运营商公有云发展史

云观察系列:百度云的一波三折

云观察系列:阿里云战略观察

超融合方案分析系列(7)思科超融合方案分析

加入技术讨论群




《大数据和云计算技术》社区群人数已经3000+,欢迎大家加下面助手微信,拉大家进群,自由交流。

喜欢钉钉扫码下面的群:

喜欢QQ群的,可以扫描下面二维码:

欢迎大家通过二维码打赏支持技术社区(英雄请留名,社区感谢您,打赏次数超过100+):


登录查看更多
0

相关内容

MongoDB 是一种文件导向的 NoSQL 数据库,由 C++ 撰写而成。
【实用书】Python技术手册,第三版767页pdf
专知会员服务
238+阅读 · 2020年5月21日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
121+阅读 · 2020年5月10日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
77+阅读 · 2020年4月24日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
96+阅读 · 2019年12月4日
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
大数据流处理平台的技术选型参考
架构文摘
4+阅读 · 2018年3月14日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
利用python操作Excel教程
Python技术博文
4+阅读 · 2017年9月13日
python pandas 数据处理
Python技术博文
4+阅读 · 2017年8月30日
python进行数据分析之数据聚合和分组运算
Python技术博文
3+阅读 · 2017年8月21日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Tutorial on NLP-Inspired Network Embedding
Arxiv
7+阅读 · 2019年10月16日
Arxiv
15+阅读 · 2019年6月25日
Arxiv
8+阅读 · 2018年5月15日
Arxiv
3+阅读 · 2018年4月5日
VIP会员
相关VIP内容
【实用书】Python技术手册,第三版767页pdf
专知会员服务
238+阅读 · 2020年5月21日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
121+阅读 · 2020年5月10日
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
77+阅读 · 2020年4月24日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
96+阅读 · 2019年12月4日
相关资讯
吐血整理!140种Python标准库、第三方库和外部工具都有了
炼数成金订阅号
14+阅读 · 2019年7月30日
盘一盘 Python 系列 8 - Sklearn
平均机器
5+阅读 · 2019年5月30日
大数据流处理平台的技术选型参考
架构文摘
4+阅读 · 2018年3月14日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
利用python操作Excel教程
Python技术博文
4+阅读 · 2017年9月13日
python pandas 数据处理
Python技术博文
4+阅读 · 2017年8月30日
python进行数据分析之数据聚合和分组运算
Python技术博文
3+阅读 · 2017年8月21日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Top
微信扫码咨询专知VIP会员