- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Mongo 数据库版本 3.4.6
我有一个文档结构类似于以下内容的集合:
{
organization: "ABC123",
tags: ["MARTHA WASHINGTON", "+15552082000"],
updatedAt : ISODate("2020-10-09T17:19:44.861Z"),
createdAt : ISODate("2020-01-14T19:46:15.957Z"),
}
我需要能够按组织进行查询,并在标签数组上使用“开头为”的正则表达式,并可选择按 updatedAt 或 createdAt 进行排序。为此,我创建了以下索引:
{
"organization" : 1,
"tags" : 1,
"createdAt" : -1
}
这是一个多键复合索引,根据我对 Mongo 的理解,它应该允许我涵盖所有情况下的查询。如果我执行如下查询:
db.getCollection('data').find({"organization": "ABC123", "search": /^MARTHA WASHINGTO/})
查询包含在索引中 - 我看到一个 FETCH/IXSCAN 阶段。
同样,如果我删除正则表达式查询并添加排序 - 查询将被完美覆盖。
db.getCollection('data').find({"organization": "ABC123", "search": "MARTHA WASHINGTON"}).sort({"createdAt":-1})
但是,如果我组合正则表达式和排序选项,我突然会在查询中看到一个额外的 SORT 阶段。示例查询:
db.getCollection('data').find({"organization": "ABC123", "search": /^MARTHA WASHINGTO/}).sort({"createdAt":-1})
这是解释的获胜计划输出:
"winningPlan" : {
"stage" : "SORT",
"sortPattern" : {
"createdAt" : -1.0
},
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"organization" : 1,
"tags" : 1,
"createdAt" : -1
},
"indexName" : "tag matches by organization",
"isMultiKey" : true,
"multiKeyPaths" : {
"organization" : [],
"search" : [
"search"
],
"createdAt" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"organization" : [
"[\"ABC123\", \"ABC123\"]"
],
"tags" : [
"[\"MARTHA WASHINGTON\", \"MARTHA WASHINGTOO\")",
"[/^MARTHA WASHINGTON/, /^MARTHA WASHINGTON/]"
],
"createdAt" : [
"[MaxKey, MinKey]"
]
}
}
}
}
},
我很困惑为什么这个查询组合没有被索引覆盖。我的理解是,开始时额外的排序阶段会导致大型集合的性能下降。谁能提供一些指导?我错过了一些限制吗?
更新:移除正则表达式查询时的获胜方案
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"organization" : 1,
"search" : 1,
"createdAt" : -1
},
"indexName" : "tag matches by organization",
"isMultiKey" : true,
"multiKeyPaths" : {
"organization" : [],
"search" : [
"search"
],
"createdAt" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"organization" : [
"[\"ABC123\", \"ABC123\"]"
],
"tags" : [
"[\"MARTHA WASHINGTON\", \"MARTHA WASHINGTON\"]"
],
"createdAt" : [
"[MaxKey, MinKey]"
]
}
}
},
最佳答案
另一个答案不太准确。来自docs
For case sensitive regular expression queries, if an index exists for the field, then MongoDB matches the regular expression against the values in the index, which can be faster than a collection scan.
Mongo 能够使用带正则表达式的索引,显然,如果您的正则表达式是后缀正则表达式,那么集合扫描实际上可能更快,因为 Mongo 必须读取整个索引树才能满足需求。
那么您的查询中发生了什么?为什么获胜的计划是 sort
?好吧,虽然它实际上可能是获取结果的最佳方式,但也有可能 Mongo 只是选择了错误的计划。
首先让我们了解 Mongo 如何选择获胜计划,计划评估是基于比较给定查询的候选计划,看看哪个返回第一批结果(默认为 101 个文档),总体“工作量”最少.工作分数代表查询阶段(索引键比较、获取文档等)中涉及的不同工作。如果多个计划在评估期间执行相同的工作,则有一些小的打破平局的奖金可以帮助选择一个计划来缓存。基本上 Mongo 会进行一场小型“比赛”并等待谁获胜。
因此,在您的情况下,由于具有索引的正则表达式性质,sort
阶段获胜,如果您完全运行计划而不是小样本,则可能会选择不同的计划。
我建议您使用 hint 进行自己的测试,这会强制 Mongo 使用某个索引,这意味着您可以强制 Mongo 为您的查询制定获胜计划。我个人认为(显然依赖于特定的正则表达式)您可以通过这样做来提高性能,因为首先排序几乎不是每一个“最佳”计划。
关于具有复杂查询的 MongoDB 索引覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64285321/
我之前发布过question已得到答复,但我也需要对此进行查询。我有一个包含这样数据的表结构(日期格式为 dd/mm/yyyy)。 ID Account Number Unit Ad
我正在使用 React Native Calendars 并尝试为议程组件构建我的数据。 预期的数据结构是(一个对象) { '2012-05-22': [{text: 'item 1 - any j
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
两列城镇和优先级。 我需要对表进行排序,以便优先级=1的城镇排在第一位,并且不按名称 ASC 排序,而其余城镇则按名称 ASC 排序。 我该怎么做? 谢谢;) 更新 SELECT * FROM map
我有三个表“Hardware_model”、“Warehouse”和“Brand”,并且表以这种方式一起引用:Hardware_model 仓库Hardware_model 品牌 现在我要执行以下
我有一个 MySQL 表 (tbl_filters),包含 3 列:id、cat、val id 和 val 是数字,cat 是 varchar。每个 id 有多行。 我还有另一个包含多个列的表 (tb
我想获取字段的不同值,比方说:field1...这需要一个如下查询:“从表中选择不同的(字段1)” 但是,对于某些记录,field1 为空,并且还有另一列可以替代 field1,即 field2。对于
表 1 - 用户 id username items 1 Paul 1(0020);2(0001); 表 2 - 项目 id name 1 name_here 在我的用户的项目中,我输入了 2(000
我想连接同一个表 4 次以获取列的显示方式,我不确定是否可以在 1 个 SQL 语句中完成。 tbl_用户名 id username 1 Adam 2 Bob 3 Chris tbl_机
首先,我刚刚开始自己学习JS,没有任何编程经验,这意味着我仍然要了解这种出色的编程语言的基本构建模块。 我的问题与我编写的以下代码有关: let orderCount = 0; con
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我正在使用 XMAPP,MySQL 正在正常运行。在 phpMyAdmin 中,我不太明白这一点,所以我尝试在 PHP 中创建一个。使用此代码,它会告诉我数据库 benutzer。尽管我在 phpMy
是否有一种高效的算法可以找到平均度最大的子图(可能是图本身)? 最佳答案 The paper "Finding a Maximum-Density Subgraph" by Andrew Goldbe
目录 1、业务背景 2、场景分析 3、流程设计 1、业务流程 2、导入流程
我有 2 个表: 1) 包含自 1900 年 1 月 1 日以来所有日期的 Masterdates 表 2) Stockdata 表,其中包含表单中的股票数据 日期、交易品种、开盘价、最高价、最低价、
我有一个非常复杂的 UI,其状态栏不断变化,其中包含多种类型的状态消息,并且 UI 具有复杂的图表控件和已加载的指示性地理 map 。 现在这些小而复杂的区域的数据上下文具有同样复杂的 ViewMod
有人可以用简单的方式向我解释为什么常量在大 O 表示法中无关紧要吗?为什么添加常量时复杂性保持不变。这不是作业问题,我只是想更好地理解这一点。让我明白这个大 O 是为了看到一个函数在接近无穷大时的行为
我在 flex 搜索索引中有以下文档。 [{ "_index": "ten2", "_type": "documents", "_id": "c323c
我有一个以零碎的方式构建的 LINQ 查询,如下所示: var initialQuery = from item in MyContext where xxx == yyy select item;
我目前正在涉足 SQL,并且希望针对我所创建的问题获得一些帮助。 为了练习一些编程,我正在制作一个 IOU 应用程序。下面是我存储的表我的借条记录(忽略一些相关栏目)。该表允许用户说“嘿,你欠我 X
我是一名优秀的程序员,十分优秀!