Mongodb多键索引中索引边界的混合问题小结
学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。
Mongodb为提高数组的查询效率,针对数组构建了多键索引。而Mongodb在应用多键数组查询时,也通过构建,减少数组查询的数值范围,来提高查询性能。本文结合Mongodb官方文档,阐述Mongodb在使用多键索引时的边界优化。
概述
索引边界定义了索引值的区间段。Mongodb在查询时,用这个区间段来查询索引中的数据。当用户针对索引字段指定多个查询条件时,mongdb尝试合并这些查询条件的区间范围来计算出更小的范围区间,来获得更快的查询速度并减少资源利用。
使用多键索引的边界交集来查询
边界交集代表多个边界相互重合的点。如有两个区间[3, 无穷大]和[无穷小,6],这两个区间的交集就是[3,6]。Mongodb将这种求交集的方式,应用到数据查询当中。有一个构建了索引的数组字段,当使用$elemMatch指定多个查询条件查询数据时,Mongodb会将查询条件合并。下边的例子,说明了这种查询优化方法。
构建结合students并插入数据
为数组创建多键索引
构建查询语句
这个语句中,只要数组中任何一个数据符合大于等于90,小于等于99的数据。
单独分析每个查询条件,第一个边界是[90,无穷大],第二个边界是[无穷小,99],在使用$elemMatch时,mongodb先计算两个边界的交集[90,99]
当不使用$elemMatch时,Mongodb不会先计算边界的交集。
该查询会查询出满足下面两个条件的文档
- 数组grades中至少有一个元素大于等于90
- 数组grades中至少有一个元素小于等于99
因为没有使用$elemMatch, Mongodb不会计算边界的交集。而是使用两个边界中的任何一个来查找,不能保证使用哪一个条件。
从解释计划当中也能看出来两者查询数据范围的不同
下面两张图片中,左边使用了$elemMatch, 右侧没有使用
复合多键索引边界混合
复合边界集合了复合多键索引中的边界。使用复合多键索引的多个字段边界值,能够减少查询时间。Mongodb不需要单独计算每个边界的查询结果。如符合索引{temperature: 1, humidity: 1}有下面的两个边界
- 温度[80, 无穷大]
- 湿度[无穷小,20]
则计算出来的复合边界就是
如果mongodb不能将这两个边界混合,mongodb只能够使用前面的字段索引来查询数据。在这个例子中,前面的字段是temperature。下面的应用,详细描述了mongodb在复合多键索引中的边界混合。
非数组字段和数组字段的边界混合
这个例子展示了mongodb通过混合边界来定义更高效的查询约束提高性能
构建survey集合并插入数据
创建复合多键索引
构建查询语句
直接看执行计划,会更清楚一些
该查询使用字段item和数组字段rating进行查找。单独来看么一个查询条件
item字段值是“abc”, mongodb在执行时,转换为边界["abc", "abc"]
rating边界是{$gte: 3},转换为[3,无穷大]
mongodb将两个边界组合进行查询
非数组字段和多个数组字段的边界混合
下面的例子展现了mongodb怎样将非数组字段和多个数组字段的边界混合
构建集合survey2并插入数据
为集合添加符合多键索引
构建查询语句
单独看每个查询条件
- item字段的边界 item: "xyz", 转换为[["xyz", "xyz"]]
- score的边界是{$lte:5},转换为[无穷小, 5],
- by的边界是 by: "anon",转换为["anon", "anon"]
Mongodb 将item的边界和ratings.score或ratings.by当中的一个边界混合,取决于查询操作符和索引值。当mongodb不能确认使用哪个边界来进行混合。执行计划也无法确定使用哪个索引来进行查询。
为了保证mongodb能够将文档数组中的边界混合,必须使用$elemMatch操作符
混合相同数组中多个字段的边界
为了能够混合相同数组中多个字段的索引边界,必须满足下面两个条件
- 除了字段名称以外,索引键必须在相同的路径上
- 查询语句必须使用$elemMatch查询相同路径上的值
在嵌入式文档数组中,使用点操作符的字段名称,如“a.b.c.d”, 就是字段d的字段路径。为了能够混合相同数组中的多个边界,$elemMatch必须在这个路径上,并且不包含字段本身。如“a.b.c”
在前面创建的集合survey2中添加索引
构建查询语句, 使用$elemMatch操作符查询ratings字段,查询出满足两个条件的数据。
看查询计划,能够看到mongodb混合了两个边界为一个边界
栏 目:MongoDB
本文地址:https://fushidao.cc/shujuku/774.html
您可能感兴趣的文章
- 02-26mongodb数据统计分析(mongodb 统计分析)
- 02-26linux怎么连接mongodb数据库(linux mongodb客户端)
- 02-26为何MongoDB突然停止数据写入?自动停止背后有何原因?
- 02-26为何MongoDB数据库内容全为空?详解查看数据库列表方法!
- 02-26MongoDB是否胜任海量数据仓库需求,兼顾存储与性能?
- 02-26MongoDB中创建新数据及字段的具体步骤是怎样的?
- 02-26MongoDB数据文件损坏了,但我的数据究竟存储在哪?
- 02-26Java如何高效使用Spring Data MongoDB进行聚合查询操作?
- 02-26如何在mongodb中插入坐标数据并添加相关字段?
- 02-26MongoDB查询数据时,如何高效编写有效的查询语句?
阅读排行
- 1mongodb数据统计分析(mongodb 统计分析)
- 2linux怎么连接mongodb数据库(linux mongodb客户端)
- 3为何MongoDB突然停止数据写入?自动停止背后有何原因?
- 4为何MongoDB数据库内容全为空?详解查看数据库列表方法!
- 5MongoDB是否胜任海量数据仓库需求,兼顾存储与性能?
- 6MongoDB中创建新数据及字段的具体步骤是怎样的?
- 7MongoDB数据文件损坏了,但我的数据究竟存储在哪?
- 8Java如何高效使用Spring Data MongoDB进行聚合查询操作?
- 9如何在mongodb中插入坐标数据并添加相关字段?
- 10MongoDB查询数据时,如何高效编写有效的查询语句?
推荐教程
- 02-01MongoDB如何彻底删除数据库?一步步指南+安全注意事项
- 02-01MongoDB导出数据有哪些高效且安全的方法?
- 09-22Mongodb多键索引中索引边界的混合问题小结
- 09-22MongoDB安装、基础操作和聚合实例介绍
- 09-22Mongodb数组字段索引之多键索引
- 09-22Mongodb通配符索引签名和使用限制问题记录
- 02-01分批导出(每批1000条)
- 09-22MongoDB Map-Reduce 使用方法及原理解析
- 09-22MongoDB开发规范与数据建模详解
- 01-31MongoDB数据库,为什么它成为现代应用的首选?





