当前位置: 首页 > 知识库问答 >
问题:

为什么索引方向在MongoDB中很重要?

龙高歌
2023-03-14

引用文档:

创建索引时,与键关联的数字指定索引的方向,因此它应该始终为1(升序)或-1(降序)。对于单键索引或随机访问检索,方向无关紧要,但如果您对复合索引进行排序或范围查询,方向很重要。

然而,我看不出为什么指数的方向对复合指数有什么影响。有人能提供进一步的解释(或示例)吗?

共有3个答案

华坚成
2023-03-14

理解两个关键点。

  1. 虽然一个索引比没有索引好,但正确的索引比任何一个都好

索引不是免费的。它们占用内存,并在执行插入、更新和删除时施加性能惩罚。通常,性能损失可以忽略不计(尤其是与读取性能的提高相比),但这并不意味着我们不能聪明地创建索引。

确定哪些字段组应该被索引在一起是关于理解你正在运行的查询。用于创建索引的字段的顺序至关重要。好消息是,如果你弄错了顺序,索引将根本不会被使用,所以很容易通过解释来发现。

您的查询可能需要排序。但是排序可能是一项昂贵的操作,因此将正在排序的字段与正在查询的字段一样对待很重要。因此,如果有索引,速度会更快。不过有一个重要的区别,排序的字段必须是索引中的最后一个字段。此规则的唯一例外是,如果字段也是查询的一部分,则“必须是最后一个”规则不适用。

可以对索引的所有键或子集指定排序;但是,排序键必须按其在索引中出现的顺序列出。例如,索引键模式{a:1,b:1}可以支持{a:1,b:1}上的排序,但不支持{b:1,a:1}上的排序。

排序必须为其所有键指定与索引键模式相同的排序方向(即升序/降序),或为其所有键指定与索引键模式相反的排序方向。例如,索引键模式{a:1,b:1}可以支持对{a:1,b:1}和{a:-1,b:-1}进行排序,但对{a:-1,b:1}不支持排序。

假设有这些索引:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

Example                                                    Index Used
db.data.find().sort( { a: 1 } )                            { a: 1 }
db.data.find().sort( { a: -1 } )                           { a: 1 }
db.data.find().sort( { a: 1, b: 1 } )                      { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } )                    { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } )                { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )   { a: 1, b: 1 }
国兴贤
2023-03-14

您正在寻找的一个简单答案是,只有在对两个或多个字段进行排序时,方向才起作用。

如果您在排序{a:1,b:-1}:

索引{a:1,b:1}将比索引{a:1,b:-1}

丁阳炎
2023-03-14

MongoDB以某种方式连接复合键,并将其用作BTree中的键。

在查找单个项目时,树中节点的顺序无关紧要。

如果您要返回一个节点范围-彼此靠近的元素将位于树的相同分支上。节点在范围内越近,检索它们的速度就越快。

使用单个字段索引-顺序无关紧要。如果它们按升序靠近,它们也将按降序靠近。

当你有一个复合键-顺序开始重要。

例如,如果键是A升序B升序,则索引可能如下所示:

Row   A B
1     1 1
2     2 6
3     2 7 
4     3 4
5     3 5
6     3 6
7     5 1

对于升序B和降序B的查询将需要按顺序跳转索引以返回行,并且速度会较慢。例如,它将返回第1、3、2、6、5、4、7行

与索引顺序相同的范围查询只会按正确的顺序返回行。

在BTree中查找记录需要O(Log(n))时间。按顺序查找一系列记录只需OLog(n)k,其中k是要返回的记录数。

如果记录无序,成本可能高达OLog(n)*k

 类似资料:
  • 我不能在设置cookie后返回任何地方,cookie设置正确,但在设置cookie后,它不会重定向任何地方。 下面是我的代码: 下面是JavaScript的功能: 这是我的函数,但不重定向到索引或其他任何地方:

  • 本文向大家介绍MongoDB中重建索引的方法,包括了MongoDB中重建索引的方法的使用技巧和注意事项,需要的朋友参考一下 要重新构建索引,请使用reIndex()。让我们首先创建一个索引。查询如下 这将产生以下输出: 以下是在MongoDB中重建索引的查询- 这将产生以下输出-

  • 为了尽快获得一个可以高效使用的工作软件系统,不仅需要为开发做计划,还需要为文档,部署,市场做计划。在一个商业工程里,这还需要销售和金融计划。没有对开发时间的预测能力,是不可能高效预测以上这些东西的。 好的估计提供了预测能力。管理者喜欢,而且应该这么做。事实是这不可能,不论是理论上还是实践上,准确预测开发软件所消耗的时间总是被管理者所忽视。我们总是被要求做那些不可能的事情,而且我们必须诚实地面对它。

  • 问题内容: 我最近找到了一个示例代码: 该方法将打开一个用户界面窗口。然后,我尝试将代码修剪如下: 两种版本均能正常工作。有什么区别? 问题答案: 任何一种代码都能在99%的时间内工作。 但是,Swing的设计使得对Swing组件的所有更新都应在事件分发线程(EDT)上完成。阅读有关并发的Swing教程以获取更多信息。 问题是它有1%的时间可能无法正常工作。您不想浪费时间尝试调试随机问题。

  • 本文向大家介绍为什么Kafka技术很重要?相关面试题,主要包含被问及为什么Kafka技术很重要?时的应答技巧和注意事项,需要的朋友参考一下 答:Kafka有一些优点,因此使用起来很重要: 高吞吐量:我们在Kafka中不需要任何大型硬件,因为它能够处理高速和大容量数据。此外,它还可以支持每秒数千条消息的消息吞吐量。 低延迟:Kafka可以轻松处理这些消息,具有毫秒级的极低延迟,这是大多数新用例所要求

  • 引用Spark数据框架、数据集和SQL手册: Spark中还没有包括一些配置单元优化。由于Spark SQL的内存计算模型,其中一些(如索引)不那么重要。其他版本将在Spark SQL的未来版本中发布。 作为Spark的新手,我对此有点困惑,原因有两个: > 即使假设数据适合内存,对非常大的数据集进行完整扫描也可能需要很长时间。我读了这篇反对在内存数据库中建立索引的文章,但我并不信服。这里的示例讨