问题标签 [mongodb-indexes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mongodb - 为什么 MongoDB 不使用索引交集?
我正在尝试重现索引交叉指令的第一个示例(http://docs.mongodb.org/manual/core/index-intersection/)但面临一个问题:mongo 不使用两个索引
我的步骤:
- 下载 mongo (3.0.3) 并安装
- 运行 mongod:mongod.exe --dbpath d:\data(文件夹为空)
- 运行mongo:mongo.exe
添加索引:
/li>检查查询说明:
/li>
如您所见,winingPlan 仅包含 item_1 索引。有包含 qty_1 索引的拒绝计划。但是没有包含索引交集的计划。我知道选择特定索引有很多条件。但在我的情况下,mongo 甚至没有计划它!
有人可以帮助我吗?
mongodb - MongoDb - 索引优化
索引优化:
我们审查了我们在昂贵的集合 [170M 文档] 上的所有索引。
我们开始删除大部分索引;剩下 2 个主要索引 [不包括主键]。这将总索引大小缩减为之前值的 1/3。
在高层我们采用“复合索引”的策略;基于集合查询中使用的文档中所有属性的共同点。
有两个主要用例用于查询此集合。
在线
• 这两个查询有两个专用索引,即 InfoId_1 (equals) 和 Source_1_StatusId_1_SoundExWord12_1 (equals, equals, in)离线——我们在这里使用 [MR]。• 此用例中使用的所有查询都有一个专用复合索引。所有查询都使用索引中设置的大部分字段。例如索引名称 Source_1_StatusId_1_InfoIdHash_1_InfoUpdateDate_1_SoundExWord12_1(等于、等于、范围、范围、用于排序)
到目前为止的结果:
在检查 MongoDB 中的执行计划后,似乎离线操作的专用索引在生产中被拒绝用于在线操作的专用索引,导致 270M 结果扫描而不是 130K 结果扫描(在 QA 中,大多数情况下选择了正确的索引)。由于某种原因,它没有使用正确的索引,目前还不清楚为什么。
到目前为止我们已经完成的更多研究/测试:一旦我们删除了在线索引,离线过程;MR 离线进程开始以良好的性能工作,因此我们确信在这里应用权限索引完全是问题。
问题/考虑:
这里有两种选择:在这里我需要你帮助实现第一个 alertnative 或优化第二个:
向 map reduce 查询 (/query+sort) 添加提示(通过 C# 2.0 旧版驱动程序)以让 MongoDB 选择正确的索引 - 找不到任何方法来做到这一点。一旦使用命令 db.infosoundexpair.find({$and: [ { "Source": { $eq: "XXX" } }, { "StatusId": { $eq: 0 } }, { "InfoIdHash": { $ gte: -2147483648 } }, {"InfoIdHash": { $lte: -2143862259 } }, { "InfoUpdateDate": { $lt: ISODate("2015-06-04T00:00:00.000Z") } } ]}) .sort({"SoundExWord12": 1}).hint("Source_1_StatusId_1_InfoIdHash_1_InfoUpdateDate_1_SoundExWord12_1").explain("executionStats"); 使用了正确的索引(在提示中定义)。
在索引和在线查询中使用不同的字段顺序重新创建专用在线索引会阻止离线进程使用该索引,使在线进程能够使用该索引,但是会降低在线进程的速度。我们认为速度的下降是因为我们从索引末尾移动到索引开头的字段(离线查询中没有使用的字段,只是在离线排序中使用)而不是使用包含($in)的等于 ($eq) 具有约 25 个潜在值,而其他两个字段是相等比较。
样本文件:
mongodb - MongoDB 不使用索引进行简单查询
我对 mongodb 不同的查询有一个奇怪的行为。目前,我使用的是 2.6.10 版本。好的,让我们为测试创建简单的集合并进行解释。
好的,它将创建包含这样的文档的集合 chich
现在,我只有 1 个唯一值product
,但是,在不久的将来(1 周),它将增加到近 30 个不同的字符串值,如下所示:
好的,我完成了我的数据结构,现在让我们看一些 mongodb 查询。
我的主要目标是获得number
for certain的所有独特值product
。
我这样做:
好的,这对于调试来说不是很冗长,我将db.runCommand
在下一行中使用。但是,现在,让我们避免使用查询来区分和查看stats
部分:
没关系,因为我们还没有创建索引,让我们添加number
字段:
重新运行之前的查询:
太好了,它使用索引,一切正常!0个扫描对象!!!
好的,让我们添加不同的查询:
这不是我们所期望的(“nscannedObjects”:500000),但是,没有产品索引,让我们创建一个:
方向没有区别,product: 1, number -1 OR product -1, number 1, OR product: 1, number: 1 的任何组合给出相同的行为。我检查了所有组合。
WTF正在进行吗?为什么它用索引扫描所有集合?目前,整个系列只包含一个产品价值,我无法猜测不同的产品会是什么。为什么常见的不同查询这么慢?1秒太慢了。。。
我不想为每一个都使用单独的集合,product
这太疯狂且效率低下,因为我需要在所有产品之间共享查询。我的真实数据库每个产品包含超过 500 万个数字,此查询需要 3 秒以上。
mongodb - 创建新的复合索引与添加到现有的复合索引之间的权衡是什么?
我正在按字段a
、b
和进行查询c
,并具有以下索引:
我正在添加一个新查询a
,按d
desc 排序。我应该将索引更改为:
或者我应该添加第二个索引:
mongodb - Do $exists and $in/nin count as equality queries for non-prefix sorts?
The index
supports this query:
Does it also support
mongodb - Mongodb 恢复丢失的文件
我试图在我的收藏中创建唯一索引。我跑了
由于meta.instanceId
文档中不存在密钥,因此 mongodb 删除了集合中的所有文档,除了一个。
如何恢复已删除的文档?
mongodb - 哪些文档具有嵌套键的 Mongo 索引?
我有看起来像的对象:
如果文档具有来自源的数据,则具有该名称的条目存在。否则不存在。例如,这只有来自 source_a 的数据:
什么索引可以帮助我加快查找具有来自给定来源的数据的文档?更准确地说,我不关心源贡献了哪些数据,只关心它是否包含在内(源对象中有一个带有该键的条目)。
我应该为每个来源建立一个索引,例如{"sources.source_z": 1}
?
想要最高效,以免源中的所有数据都被索引,只要它的存在。
mongodb - 相同的查询在 mongo 中命中两个不同的索引
我正在使用具有两组不同索引的 mongoDB。我的查询是
有两个复合索引
- x+时间
- 时间+x+y+z
在这种情况下,我确实解释了(“executionStats”)并且两次结果都不同,有时它会达到索引#1,有时会达到索引#2,知道为什么它会达到两个不同的索引吗?
谢谢。
mongodb - 在聚合框架中使用文本搜索时的 MongoDB 索引优化
我们正在 MongoDB 之上构建一个简化版本的搜索引擎。
样本数据集
我们希望避免使用“offset-limit”对结果进行分页,为了做到这一点,我们基本上是通过修改查询的“where/match”子句来使用“seek 方法”,以便能够使用索引而不是遍历集合以获取所需的结果。有关“寻求方法”的更多信息,我强烈建议您阅读http://use-the-index-luke.com/blog/2013-07/pagination-done-the-postgresql-way
搜索引擎通常按分数排序结果,并按后代顺序更新日期。为此,我们在聚合管道中使用文本搜索功能,如下所示。
第一页
第二页
最后一页
请注意我们如何按分数、updDate 和 id 对结果进行排序,以及在第二个匹配阶段我们如何尝试使用文档的分数值、更新日期和最后的 id 对它们进行分页。
索引创建考虑到文本索引前缀字段不能涵盖文本查询,请参阅问题https://jira.mongodb.org/browse/SERVER-13018,尽管我不确定这是否适用于我们的案例。
由于“executionStats”和“allPlansExecution”模式在聚合框架中不起作用,请参阅https://jira.mongodb.org/browse/SERVER-19758我不知道 MongoDB 如何尝试解析查询。
由于索引交集不适用于文本搜索,请参阅https://jira.mongodb.org/browse/SERVER-3071(在 2.5.5 解决)和http://blog.mongodb.org/post/87790974798/efficient -indexing-in-mongodb-26作者所说的
在阅读了https://docs.mongodb.org/manual/MongoDB-indexes-guide-master.pdf的 3.4 节(文本搜索教程)和 3.5 节(索引策略)后,没有得出任何明确的结论。
那么从文本搜索的角度来看,对该集合进行索引的最佳索引策略是什么?
第一个匹配阶段的一个索引和第二个(分页)匹配阶段的另一个索引?
考虑到两个匹配阶段的字段的复合索引?
以上都不是?
谢谢