Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践
周全集合扫描请求我们拜访所有1,000,000个文档。仅索引surname就削减到20,028个文件 - 实际上是收集中的所有“SMITHS”。添加firstname将文档数削减到188个。经由过程添加dob,我们只需可以拜访两个:拜访一个索引条目并大年夜那边拜访集合以获取德律风号码。 最后的优化是添加德律风号码tel属性。 如今我们根本不须要拜访集合 - 我们须要的就是索引。 这有时被称为“覆盖”指数。
索引是一个拥有本身独一存储的对象,它为集合供给了一条快速拜访路径。索引的存在主如果为了进步机能,是以,在优化MongoDB机能时,有效懂得和应用索引是异常重要的。
1、B-树索引
B-树索引是MongoDB的默认索引构造。以下是B-树索引构造高等级的概述。

B-树索引具有分层树构造。树顶部是头部块。此块包含指向任何给定范围的键值的恰当分支块的指针。分支块平日会指向恰当的叶子块以获得更具体典范围,或者对于更大年夜的索引,则指向另一个分支块。 叶子块包含一个键值列表和指向磁盘上文档地位的指针。
查看膳绫擎的图,让我们想象一下MongoDB若何遍历这个索引。 如不雅我们须要拜访“BAKER”的记录,我们起首会查阅头晨块。 头部块会告诉我们,大年夜A到K开端的键值存储在最左边的分支块中。 拜访这个分支块,我们发来岁夜A到D开端的键值存储在最左边的叶子块中。 咨询这个叶子块,我们发明值“BAKER”以及它接洽关系的磁盘地位,我们将用它来获得有关的文件。
叶子块包含前一个和后一个叶子块的链接。 这许可我们以升序或降序扫描索引,并且许可应用$gt或$lt操作符典范围萌芽应用索引进行处理。
与其他索引策略比拟,B-树索引具有以下长处:
- 因为每个叶子节点处于雷同的深度,所以机能是异常可猜测的。 大年夜理论上讲,集合中的任何文档都不会跨越三或四次I/O。
- B树为大年夜型集合供给了优胜的机能,因为深度最多为四个(一个头部块,两个分支块级别和一个叶子块级别)。 一般来说,没有任何文件须要四个以上的I/O来定位。 实际上,因为头部块几乎老是已经加载到内存中,而分支块平日加载到内存中,所以实际的物理磁盘攫取次数平日只有一次或两次。
- 因为与前一个和后一个叶子块的链接,所以B-树索引支撑范围萌芽以及精确的查找是可行的。
B-树索引供给了灵活高效的萌芽机能。然则,在更改数据时保护B-树可能很昂贵。例如,推敲在膳绫擎的图表中插入一个键值为“NIVEN”的文档。冲要入集合,我们必须在“L-O”块中添加一个新条目。如不雅在这个区域内有余暇空间,那么成本是很大年夜的,但也许不会过多。然则如不雅块中没有可用空间会产生什么?
如不雅叶子块中没有余暇空间用于新条目,则须要索引拆分。必须分派新块,并将现有块中的一半条目移入新块。除此之外,还须要在分支块中添加一个新条目(以便指向新创建的叶子块)。如不雅分支块中没有余暇空间,则分支块也必须瓜分。
2、索引选择性
属性或属性组的选择性是对这些属性的索引的有效性的常费用量。如不雅文档或索引具有大年夜量的独一值或反复值很少,则它们是有选择的。例如,DATE_AND_TIME_OF_BIRTH属性将异常有选择性,而GENDER属性将不会被选择。
选择性索引比非选择性索引更有效,因为它们更直接地指向特定的值。MongoDB优化器平日会应用最有选择性的索引。
连接索引只是一个包含多个属性的索引。连接键的长处在于它比单个键索引更具有选择性。属性的组合将指向比由单个属性构成的索引更少数量的文档。包含find()或$match子句中引用的所有属性的连接索引将特别有效。
这些索引拆分是一项昂贵的操作:必须分派新块,并将索引条目年腋荷琐块移到另一个块。
3、独一索引
独一的索引是阻拦构成索引的属性的任何反复值的索引。如不雅你测验测验在包含词攀类反复值的集合上创建独一索引,则会收到缺点消息。同样,如不雅测验测验插入包含反复独一索引键值的文档,也会收到缺点。
平日会创建一个独一索引,以防止反复值而不是进步机能。 然则,独一的索引文件平日异常有效 - 它们只能指向一个文件,是以异常有选择性。
4、连接索引
如不雅你经常萌芽集合中的多个文档,那么为这些文档创建一个连接索引是一个很好的主意。例如,我们可以经由过程Surname(姓氏)和Firstname(名字)萌芽people集合。在这种情况下,我们可能欲望在Surname和Firstname上创建一个索引。例如:
- db.people.createIndex({ "Surname":1 ,"Firstname":1} );
应用如许的索引,我们可以快速找到people中所有匹配给定的Surname \ Firstname 组合。 如许的索引比零丁的Surname索引或零丁的Surname和Firstname索引要有效得多。
如不雅连接索引只能在所有键出现find()或$match时应用,则连接索引的应用可能会异常有限。荣幸的是,连接索引可以异常有效地应用,供给任何初始或重要属性。重要属性是在索引定义中最早指定的属性。

上图显示了将属性添加到连接索引时获得的改进。涉及的萌芽是在一个1,000,000个文档的people集合上:
- db.people.find(
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 付出宝让我们在无现金的门路上越走越宽,这不,官方整顿了比来更新的2个功能,给我们带来了极大年夜便利和>>>详细阅读
本文标题:带你深入理解有效的MongoDB索引
地址:http://www.17bianji.com/lsqh/39021.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示