首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MongoDB 复合索引

MongoDB支持复合索引,即将多个键组合到一起创建索引。该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形。其次复合索引使用的时候,也可以通过前缀法来使用索引。...MongoDB中的复合索引与关系型数据库基本上一致。在关系型数据库中复合索引使用的一些原则同样适用于MongoDB。本文主要描述MongoDB复合索引。...对于单键索引,其顺序并不是特别重要,因为MongoDB可以在任一方向遍历索引 对于复合索引,按何种方式排序能够决定该索引在查询中能否被使用到。...//以下内容基于前面在{name:1,age:1}键上创建的索引来考察这个复合索引排序时被使用到的场景 //基于{name:1,age:1}的排序 > db.persons.find().sort({...5、小结 a、复合索引是基于多个键(列)上创建的索引 b、复合索引在创建的时候可以为其每个键(列)来指定排序方法 c、索引键列的排序方法影响查询在排序时候的操作,方向一致或相反的才能被匹配

3K10

MongoDB复合索引详解

摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能。 什么是复合索引复合索引,即Compound Index,指的是将多个键组合到一起创建索引,这样可以加速匹配多个键的查询。...IXSCAN即索引扫描,使用的是age索引;FETCH即根据索引去查询文档,查询的时候需要使用name进行过滤。...但是,IXSCAN使用的是name与age的复合索引;FETCH即根据索引去查询文档,不需要过滤。 这个示例的数据量太小,并不能看出什么问题。...对比使用复合索引前后的结果,发现totalDocsExamined从28338降到了0,表示使用复合索引之后不再需要去查询文档,只需要扫描索引就好了,这样就不需要去访问磁盘了,自然快了很多。...参考 MongoDB 复合索引 MongoDB文档:Compound Indexes 版权声明: 转载时请注明作者Fundebug以及本文地址: https://blog.fundebug.com/2018

1.2K40
您找到你想要的搜索结果了吗?
是的
没有找到

优化MongoDB复合索引

和所有数据库一样,字段的顺序在MongoDB复合索引中至关重要。如果索引以anonymous字段为前缀,Mongo可以直接跳到非匿名评论对应的记录。...需要有一个索引,能让MongoDB快速定位到非匿名区,并以rating字段由大到小的顺序扫描该区。 ? MongoDB使用这个索引吗?并不会,因为这个索引无法在查询优化器的选择中胜出。...查询优化器可不管索引是否对排序有帮助。 不过我们可以使用Hint字段强制Mongo使用索引 ? 现在,nscanned从2变高到了3,可是scanAndOrder变成false了。...总结 针对一个包含等式过滤,范围过滤和排序字段的查询,建立的复合索引的字段优先级,可以参考下面的规则 将所有等式过滤字段放在复合索引中最靠前的部分。 其次放入排序字段。...最后,如果一张表上有多个索引,有时业务指定Hint可能会比MongoDB使用查询优化器选择的索引更好。 讲完了,对于包含多个字段的复杂查询,建立复合索引是需要技巧的。希望本篇文章能够帮助到你。

2.8K20

优化MongoDB复合索引

和所有数据库一样,字段的顺序在MongoDB复合索引中至关重要。如果索引以anonymous字段为前缀,Mongo可以直接跳到非匿名评论对应的记录。...需要有一个索引,能让MongoDB快速定位到非匿名区,并以rating字段由大到小的顺序扫描该区。 ? MongoDB使用这个索引吗?并不会,因为这个索引无法在查询优化器的选择中胜出。...查询优化器可不管索引是否对排序有帮助。 不过我们可以使用Hint字段强制Mongo使用索引 ? 现在,nscanned从2变高到了3,可是scanAndOrder变成false了。...总结 针对一个包含等式过滤,范围过滤和排序字段的查询,建立的复合索引的字段优先级,可以参考下面的规则 将所有等式过滤字段放在复合索引中最靠前的部分。 其次放入排序字段。...最后,如果一张表上有多个索引,有时业务指定Hint可能会比MongoDB使用查询优化器选择的索引更好。 讲完了,对于包含多个字段的复杂查询,建立复合索引是需要技巧的。希望本篇文章能够帮助到你。

2.8K30

「生产事故」MongoDB复合索引引发的灾难

注意:不用索引排序操作,会在内存超过32MB时终止,也就是说MongoDB只能支持32MB以内的非索引排序 知识点二:单列索引不在乎方向 无论是MongoDB还是MySQL都是用的树结构作为索引,如果排序方向和索引方向相反...复合索引结构示意图如下所示: ? 该索引刚好和我们讨论的是一样的,userid顺序,score倒序。 我们需要直面第二个问题:复合索引使用时需不需要在乎方向?...,因此为了使用索引,所以需要从左侧开始遍历 从倒序顺序中找小于某个值的数据,势必会扫描很多无用数据,然后丢弃,当前场景下找大于某个值才是最佳方案 所以MongoDB为了更多场景考虑,在该种情况下,放弃了复合索引...db.sku_main.ensureIndex({"orgCode": 1, "_id": -1},{background:true}); 犯的错误一模一样,所以MongoDB放弃了复合索引使用,...索引索引的方向) MongoDB数据库单列索引可以不在乎方向,如对无索引字段排序需要控制数据量级(32M) MongoDB数据库复合索引使用中一定要注意其方向,要完全理解其逻辑,避免索引失效

1.1K30

「生产事故」MongoDB复合索引引发的灾难

注意:不用索引排序操作,会在内存超过32MB时终止,也就是说MongoDB只能支持32MB以内的非索引排序 知识点二:单列索引不在乎方向 无论是MongoDB还是MySQL都是用的树结构作为索引,如果排序方向和索引方向相反...复合索引结构示意图如下所示: 该索引刚好和我们讨论的是一样的,userid顺序,score倒序。 我们需要直面第二个问题:复合索引使用时需不需要在乎方向?...,因此为了使用索引,所以需要从左侧开始遍历 从倒序顺序中找小于某个值的数据,势必会扫描很多无用数据,然后丢弃,当前场景下找大于某个值才是最佳方案 所以MongoDB为了更多场景考虑,在该种情况下,放弃了复合索引...db.sku_main.ensureIndex({"orgCode": 1, "_id": -1},{background:true}); 犯的错误一模一样,所以MongoDB放弃了复合索引使用,该为单列索引...索引索引的方向) MongoDB数据库单列索引可以不在乎方向,如对无索引字段排序需要控制数据量级(32M) MongoDB数据库复合索引使用中一定要注意其方向,要完全理解其逻辑,避免索引失效 最后

1.5K20

MongoDB索引使用总结

本文梳理了 MongoDB 索引的底层结构以及使用经验,不足之处欢迎大家指正。 背景 MongoDB 提供范围广泛的索引类型和功能以及特定于语言的排序顺序,以支持对数据的复杂访问模式。...MongoDB 在集合级别定义索引,并支持 MongoDB 集合中文档的任何字段或子字段的索引。 常见的有以下类型: 键索引复合索引、多键索引、地理空间索引、全文本索引和哈希索引。...`db.col.createIndex({"a":1})` createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。...Key 是唯一的。...使用建议 遵从 ESR 原则 对于复合索引,此经验法则有助于确定索引中字段的顺序: 首先,添加运行 等值 查询的那些字段, 下一个要索引的字段应该反映查询的排序顺序, 最后的字段表示要访问的数据范围。

56613

「Mysql索引原理(八)」使用索引扫描做排序

MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描;如果explain出来的type列的值为index,则说明MySQL使用索引扫描来做排序。...这基本上都是随机I/O,因此按索引顺序读取数据的速度通常要比顺序地全表扫描慢,尤其是在I/O密集型的工作负载时。 MySQL可以使用同一个索引既满足排序,又用于查找行。...只有当索引的顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向都一样时,MySQL才能使用索引结果来做排序。...如果查询需要关联多张表,则只有当ORDER BU子句引用的字段全部为第一个表时,才能使用索引排序。...即使order by子句不满足索引的最前左缀的要求,也可以哟用于查询排序,这是因为索引的第一列被指定为一个常数。 还有更多可以使用索引排序的查询示例。

1.2K10

软件测试|Mongodb的分页优化及索引使用

合理地对数据库命令及索引进行优化,可以很大幅度提升接口性能mongo分页查询在Java中使用mongodb的MongoTemplate进行分页时,一般的策略是使用skip+limit的方式,但是这种方式在需要略过大量数据的时候就显得很低效...其实和mysql数量大之后推荐用limit m,n一样。官方建议使用范围查询,可以使用索引分页相比,偏移量增加时通常会产生更好的性能。...因为使用索引需要进行两次查找:一次查找索引条目,一次根据索引指针去查找相应的文档。而全表扫描只需要进行一次查询。在最坏的情况,使用索引进行查找次数会是全表扫描的两倍。效率会明显比全表扫描低。...而相反在提取较小的子数据集时,索引就非常有效,这就是我们为什么会使用分页。...每个阶段将其结果(文档或索引键)传递给父节点。中间节点操纵由子节点产生的文档或索引键。根节点是MongoDB从中派生结果集的最后阶段。

97310

软件测试|Mongodb的分页优化及索引使用

合理地对数据库命令及索引进行优化,可以很大幅度提升接口性能mongo分页查询在Java中使用mongodb的MongoTemplate进行分页时,一般的策略是使用skip+limit的方式,但是这种方式在需要略过大量数据的时候就显得很低效...其实和mysql数量大之后推荐用limit m,n一样。官方建议使用范围查询,可以使用索引分页相比,偏移量增加时通常会产生更好的性能。...因为使用索引需要进行两次查找:一次查找索引条目,一次根据索引指针去查找相应的文档。而全表扫描只需要进行一次查询。在最坏的情况,使用索引进行查找次数会是全表扫描的两倍。效率会明显比全表扫描低。...而相反在提取较小的子数据集时,索引就非常有效,这就是我们为什么会使用分页。...每个阶段将其结果(文档或索引键)传递给父节点。中间节点操纵由子节点产生的文档或索引键。根节点是MongoDB从中派生结果集的最后阶段。

1K20

数据库MongoDB-索引

一般在数据大量变化后,会使用重建索引来提升索引性能。重建索引是删除原索引重新创建的过程,建议反复使用。 语法格式:db.COLLECTION_NAME.reIndex() ?...MongoDB中的索引类型 在MongoDB中支持多种类型的索引,包括单字段索引复合索引、多key索引、文本索引等,每种类型的索引有不同的使用场合。...语法格式:db.COLLECTION_NAME.createIndex({索引键名:排序规则, 索引键名:排序规则,......}); 复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询...,在使用时,当查询使用到多个字段的时候,尽量使用复合索引,而不是交叉索引。...内存使用 由于索引是存储在内存(RAM)中,你应该确保该索引的大小超过内存的限制。 如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降。

6K40

MongoDB 索引-Index

# MongoDB 索引-Index 概述 索引的类型 单字段索引 复合索引 其他索引 索引的管理操作 索引的查看 创建索引 索引的移除 索引使用 执行计划 涵盖的扫描 # 概述 索引支持在MongoDB...如果查询存在适当的索引MongoDB可以使用索引限制必须检查的文档数。 索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。...索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。...对于单个字段索引排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。...# 复合索引 MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。 复合索引中列出的字段顺序具有重要意义。

1.4K20

MongoDB 索引详解

) 针对单属性索引排序顺序无关紧要,因为MongoDB能够在任意方向来回移动。...单属性索引示例图: 详细信息:https://docs.mongodb.com/manual/core/index-single/ 1.2 复合索引(Compound Index) 针对单复合索引...4.交叉索引 MongoDB可以使用多个索引的交叉来满足查询,通常每个交叉索引包含两个索引,但是MongoDB能够使用多个或嵌套索引交叉来实现查询。...4.1 索引前缀交叉 针对交叉索引MongoDB能够使用交叉索引中任意一个索引的整个索引或者索引的前缀,索引前缀是指一个复合索引索引的子集,由第一个或者前N个索引属性中的组成; 举例: 索引项如下...: “A” } ) 4.2 索引交叉与复合索引 索引交叉并不意味着复合索引没必要存在,因为属性在索引中的排列顺序和排序方式能够影响到复合索引复合索引不支持包含索引前缀或者不同的排序方式的查询情况

95020

都 2020了,你该知道MongoDB优化策略了~

MongoDB在指定_id与指定_id插入时 速度相差很大,指定_id会减慢插入的速率。 ​...对于包含多个键的查询,创建包含这些键的复合索引是个不错的解决方案。复合索引的键值顺序很重要,理解索引最左前缀原则。 解读:例如在test集合上创建组合索引{a:1,b:1,c:1}。...TTL索引是一种单字段索引,不能是复合索引。TTL删除文档后台线程每60s移除失效文档。不支持定长集合。 ​ 需要在集合中某字段创建索引,但集合中大量的文档包含此键值时,建议创建稀疏索引。...使用findOne在数据库中查询匹配多个项目,它就会在自然排序文件集合中返回第一个项目。如果需要返回多个文档,则使用find方法。 ​...但是批量提交的BSON Size超过48MB。 禁止一次取出太多的数据进行排序MongoDB目前支持对32M以内的结果集进行排序。如果需要排序,请尽量限制结果集中的数据量。

2K21

MongoDB系列四(索引).

tips:排序方向并不重要:MongoDB可以在任意方向上对索引进行遍历。 tips:查询中的字段顺序无关紧要,MongoDB 会自动找出可以使用索引的字段,而无视查询的字段顺序。...$or:能够使用索引,但是$or 查询会将 or 的条件拆分成多个独立的查询,然后再将结果合并在一起。这是很低效的,建议用。建议用 $in 取代 $or 。...如果查询中有多个排序方向或者查询条件中有多个键,复合索引就非常有效。 db.userInfo.ensureIndex({"age":1,"age":1})  进行多键排序时,索引的方向尤为重要。...尽量做到多键排序的方向和复合索引的方向是一致的,因为这能很大的避免在内存中进行排序的运算。...因此,这个复合索引可以当作{"age" : 1}索引一样使用。 唯一索引 唯一索引可以确保集合的每一个文档的指定键都有唯一值。

2.3K50

MySQL-索引优化篇(2)_使用索引扫描来优化排序

---- 使用索引扫描来优化排序 存储引擎: Innodb 重点: 优化排序 手段:利用索引 两个思路: 1 通过排序操作 、 2 按照索引顺序扫描数据 ---- 索引的列顺序和Order By子句的顺序完全一致...如果order by 都使用升序的 using index condition:5.6加入 ,会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行...在使用order by关键字的时候,如果待排序的内容不能由所使用索引直接完成排序的话,那么MySQL有可能就要进行“文件排序” 【其实并不是从文件中查找排序,不要误解】。...---- 看下索引情况 ? 最左侧的索引 rental_date 使用范围查询 来验证下 ?...结论: 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引 ---- order by中的字段全部在关联表中的第一张表中

59070

【mongo 系列】索引浅析

、B + 树都可以用来做索引 mongodb 使用索引和不使用索引 MongoDB使用索引的查询的时候,会先扫描所有的文档,再匹配符合条件的文档。...mongoDB 在 ID 上建立了唯一的单键索引,所以经常会使用 id 来进行查询;在索引字段上进行精确匹配、排序以及范围查找都会使用索引; 创建一个倒序的索引db.users. createIndex...({age:-1}); 复合索引 在多个特定的属性上建立索引复合索引键的排序顺序,可以确定该索引是否可以支持排序操作;在索引字段上进行精确匹配、排序以及范围查找都会使用索引,但与索引的顺序有关;为了性能考虑...,所有集合在_id字段上都有一个索引,应用程序和用户可以添加额外的索引来支持重要的查询和操作 复合索引 MongoDB 支持复合索引,其中单个索引结构保存对集合文档中多个字段的引用。...通过索引对查询结果进行排序 为了支持有效的查询,在指定索引字段的顺序和排序顺序时间 确保索引有足够的内存 内存有限的情况下,MongoDB 通过保存最近的值来淘汰老值,mongodb索引还是很消耗内存的

1.6K10

mongodb 索引详解(二)

复合索引 MongoDB支持复合索引,其中单个索引对集合文档中多个字段[1]的引用。下图说明了两个字段的复合索引示例: ?...对于单字段索引,键的排序顺序无关紧要,因为MongoDB可以在任一方向上遍历索引。但是,对于复合索引排序顺序决定索引是否可以支持排序操作。 Events集合包含字段username和date。...然后按升序date值排序, 如下所示: db.events.find().sort( { username: 1, date: 1 } ) 有关排序顺序和复合索引的详细信息,请参阅 使用索引对查询结果排序...,MongoDB可以使用索引来支持对索引前缀的查询。...当需要使用前缀索引时,MongoDB可以使用复合索引代替。 2.4 索引交集 从2.6版开始,MongoDB可以使用索引交集来完成查询。选择创建支持查询或依赖索引交集,取决于系统的细节。

1.2K30

MongoDB中$type、索引、聚合

MongoDB中$type、索引、聚合 1、$type 1.1 说明 1.2 使用 2、索引 2.1 说明 2.2 原理 2.3 操作 2.4 复合索引 3、聚合 3.1 说明 3.2 使用 3.3...索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。 2.2 原理   从根本上说,MongoDB中的索引与其他数据库系统中的索引类似。...如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。...sparse Boolean 对文档中不存在的字段数据启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出包含对应字段的文档.。...2.4 复合索引 说明: MongoDB 支持复合索引,其中单个索引结构包含对 集合文档中多个字段引用。

1.5K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券