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

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

判断是:它应该不是数据库整体缓慢根源,因为第一它查询条件足够简单暴力,完全命中索引,在索引之上有一点其他查询条件而已,第二在查询记录存在相同结构不同条件查询,耗时非常短。...复合索引结构示意图如下所示: ? 该索引刚好和我们讨论是一样,userid顺序,score倒序。 我们需要直面第二个问题:复合索引使用时需不需要在乎方向?...,所以需要从左侧开始遍历 从倒序顺序找小于某个值数据,势必会扫描很多无用数据,然后丢弃,当前场景下找大于某个值才是最佳方案 所以MongoDB为了更多场景考虑,在该种情况下,放弃了复合索引,选用其他索引...db.sku_main.ensureIndex({"orgCode": 1, "_id": -1},{background:true}); 犯错误一模一样,所以MongoDB放弃了复合索引使用,...,如对无索引字段排序需要控制数据量级(32M) MongoDB数据库复合索引使用中一定要注意其方向,要完全理解其逻辑,避免索引失效

1.1K30

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

判断是:它应该不是数据库整体缓慢根源,因为第一它查询条件足够简单暴力,完全命中索引,在索引之上有一点其他查询条件而已,第二在查询记录存在相同结构不同条件查询,耗时非常短。...如果MongoDB查询计划器没法从索引得到排序顺序,那么它就需要在内存对结果排序。...复合索引结构示意图如下所示: 该索引刚好和我们讨论是一样,userid顺序,score倒序。 我们需要直面第二个问题:复合索引使用时需不需要在乎方向?...,所以需要从左侧开始遍历 从倒序顺序找小于某个值数据,势必会扫描很多无用数据,然后丢弃,当前场景下找大于某个值才是最佳方案 所以MongoDB为了更多场景考虑,在该种情况下,放弃了复合索引,选用其他索引...db.sku_main.ensureIndex({"orgCode": 1, "_id": -1},{background:true}); 犯错误一模一样,所以MongoDB放弃了复合索引使用,该为单列索引

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

初识MongoDB索引

索引就像图书目录一样,可以让我们快速定位到需要内容,关系型数据库中有索引,NoSQL当然也有,本文我们就先来简单介绍下MongoDB索引。...---- 索引创建 默认情况下,集合_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合索引: db.sang_collect.getIndexes() 结果如下: [...当我们给x字段建立索引之后,再根据x字段去查询,速度就非常快了,我们看下面这个查询操作执行计划: db.sang_collect.find({x:9999}).explain("executionStats...,默认索引名字为字段名_排序值,当然我们可以在创建索引时自定义索引名字,如下: db.sang_collect.ensureIndex({x:1},{name:"myfirstindex"}) 此时创建好索引如下...好了,MongoDB索引入门我们就说到这里,小伙伴们有问题欢迎留言讨论。 参考资料: 1.《MongoDB权威指南第2版》

1.2K50

MongoDB(五)—-MongoDB索引类型

MongoDB中支持多种类型索引,包括单字段索引复合索引、多key索引、文本索引等,每种类型索引有不同使用场合。...1.单字段索引 指的是在索引只包含了一个键,MongoDB默认创建_Id索引也是这种类型 创建方式:createIndexes({索引键:排序规则}) db.user.createIndex({...在查询文档时,在查询条件包含一个交叉索引键或者在一次查询中使用多个交叉索引键作为查询条件都会触发交叉索引。...复合索引是单字段索引升级版本,它针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同文档按第二个字段排序,以此类推 语法格式: db.COLLECTION_NAME.createIndex...,不光能满足多个字段组合起来查询,能满足所有能匹配符合索引前缀查询。

1.8K20

MongoDB 复合索引

MongoDB支持复合索引,即将多个键组合到一起创建索引。该方式称为复合索引,或者叫组合索引,该方式能够满足多键值匹配查询使用索引情形。其次复合索引使用时候,可以通过前缀法来使用索引。...MongoDB复合索引与关系型数据库基本上一致。在关系型数据库复合索引使用一些原则同样适用于MongoDB。本文主要描述MongoDB复合索引。.../leshami/article/details/53541978 2、复合索引一些特性 复合索引可以支持要求匹配多个键查询 复合索引每一个键顺序非常重要,这将决定该索引在查询过程能否被使用到...name值升序进行排列 //其次是age键,在name之后按照升序排列 //下面过滤条件仅使用一个name键来查看执行计划 > db.persons.find({name:"robinson.cheng...对于单键索引,其顺序并不是特别重要,因为MongoDB可以在任一方向遍历索引 对于复合索引,按何种方式排序能够决定该索引在查询能否被使用到。

3K10

MongoDB各种类型索引

上篇文章我们介绍了MongoDB索引简单操作,创建、查看、删除等基本操作,不过上文我们只介绍了一种类型索引,本文我们来看看其他类型索引。...---- _id索引 我们在上文介绍过,我们往集合添加文档时,默认情况下MongoDB都会帮助我们创建一个名为_id字段,这个字段就是一个索引。...}) 此时执行如下查询语句时就会用到这个复合索引: db.sang_collect.find({x:1,y:999}) 小伙伴们可以通过查看查询计划来确定确实使用到了上文创建好索引。...文档,如下: db.sang_collect.find({$text:{$search:"PHP Python -Java"}}) 建立了全文索引之后,我们可以查看查询结果相似度,使用$meta,...好了,MongoDB索引问题我们就说到这里,小伙伴们有问题欢迎留言讨论。 参考资料: 1.《MongoDB权威指南第2版》

1.3K70

mongo创建索引索引相关方法

}) # 你可以设置使用多个字段创建索引(关系型数据库称作复合索引) db.fund_tags.createIndex({"title":1,"description":-1}) Mongo提供两种建索引方式...2、复合索引 MongoDB 支持复合索引,其中复合索引结构包含多个字段 复合索引可以支持在多个字段上进行匹配查询,语法结构如下: db.collection.createIndex ({ <key1...需要注意是,在建立复合索引时候一定要注意顺序问题,顺序不同将导致查询结果不相同。...$nin:不包含,这个操作符总是会全表扫描 对于管道索引很容易出现意外,只有在管道最开始时match sort可以使用索引,一旦发生过project投射,group分组,lookup表关联...这样即使使用索引,请求开销不会优化很多,执行速度会很慢。

3.5K20

【赵渝强老师】MongoDB索引(下)

该方式称为复合索引,或者叫组合索引,该方式能够满足多键值匹配查询使用索引情形。其次复合索引使用时候,可以通过前缀法来使用索引MongoDB复合索引与关系型数据库基本上一致。...在关系型数据库复合索引使用一些原则同样适用于MongoDB。...对于单键索引,其顺序并不是特别重要,因为MongoDB可以在任一方向遍历索引。对于复合索引,按何种方式排序能够决定该索引在查询能否被使用到。...db.emp.createIndex({"deptno":1,"sal":-1}) 在前面的内容,我们已经在deptno上按照升序、sal上按照降序建立了复合索引,下面测试不同排序下,是否执行索引...) (七)小结 复合索引是基于多个键(列)上创建索引 复合索引在创建时候可以为其每个键(列)来指定排序方法 索引键列排序方法影响查询在排序时候操作,方向一致或相反才能被匹配 复合索引与前缀索引通常在匹配情形下才能被使用

43600

【赵渝强老师】MongoDB索引(上)

索引是一种特殊数据结构,索引以易于遍历形式存储了数据部分内容(如:一个特定字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引存储位置在内存,所在从索引检索数据会非常快。...如果没有索引MongoDB必须扫描集合每一个文档,这种扫描效率非常低,尤其是在数据量较大时。...当查询表数据时候,先查询目录(索引行地址,再通过行地址查询到表数据,从而提高查询性能。 下图说明了在MongoDB索引在查询和排序是如何工作?...当创建集合时候,MongoDB自动在_id上创建一个唯一性索引,由于是唯一性,所以可以防止重复_id值插入到集合。...":1,"sal":-1}) [up-44d44834418a58abc7b41fccde14b01698e.png] 注意:除了可以使用explain()生成执行计划外,还可以有几个可选参数,如下:

80800

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

合理地对数据库命令及索引进行优化,可以很大幅度提升接口性能mongo分页查询在Java中使用mongodbMongoTemplate进行分页时,一般策略是使用skip+limit方式,但是这种方式在需要略过大量数据时候就显得很低效...skip: 跳过指定数量数据. 可以用来跳过当前页之前数据,即跳过pageSize*(n-1)。limit: 指定MongoDB读取记录条数,可以当做页面大小pageSize。...例如,在文件表,我们拥有一个"type"列索引,如果在"type"列,android占了50%,如果现在要查询一个类型为android,文件名为“test.apk"文件,我们则需要在表50%数据查询...在查询计划中出现了很多stage,下面列举经常出现stage以及他含义:TEXT:使用全文索引进行查询时候stage返回通过这些信息就能判断查询时如何执行了其他如果数据文件大于系统内存,查询速度会下降几个数量级...1000万数据时候没有索引情况下查询可能会几秒钟甚至更久。另外一点是数据索引如果大于内存,速度会下降很多。而且对于多条件查询,如果你查询顺序和索引顺序不同,不能使用索引

96210

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

合理地对数据库命令及索引进行优化,可以很大幅度提升接口性能mongo分页查询在Java中使用mongodbMongoTemplate进行分页时,一般策略是使用skip+limit方式,但是这种方式在需要略过大量数据时候就显得很低效...skip: 跳过指定数量数据. 可以用来跳过当前页之前数据,即跳过pageSize*(n-1)。limit: 指定MongoDB读取记录条数,可以当做页面大小pageSize。...例如,在文件表,我们拥有一个"type"列索引,如果在"type"列,android占了50%,如果现在要查询一个类型为android,文件名为“test.apk"文件,我们则需要在表50%数据查询...在查询计划中出现了很多stage,下面列举经常出现stage以及他含义:TEXT:使用全文索引进行查询时候stage返回通过这些信息就能判断查询时如何执行了其他如果数据文件大于系统内存,查询速度会下降几个数量级...1000万数据时候没有索引情况下查询可能会几秒钟甚至更久。另外一点是数据索引如果大于内存,速度会下降很多。而且对于多条件查询,如果你查询顺序和索引顺序不同,不能使用索引

1K20

MongoDB 索引-Index

# MongoDB 索引-Index 概述 索引类型 单字段索引 复合索引 其他索引 索引管理操作 索引查看 创建索引 索引移除 索引使用 执行计划 涵盖扫描 # 概述 索引支持在MongoDB...如果没有索引MongoDB必须执行全集合扫描,即扫描集合每个文档,以选择与查询语句匹配文档。...此外,MongoDB还可以使用索引排序返回排序结果。...# 复合索引 MongoDB还支持多个字段用户定义索引,即复合索引(Compound Index)。 复合索引列出字段顺序具有重要意义。...# 索引使用 # 执行计划 分析查询性能(Analyze Query Performance)通常使用执行计划(解释计划、Explain Plan)来查看查询情况,如查询耗费时间、是否基于索引查询等

1.4K20

MongoDB 索引

为啥需要索引? 增加索引是为了提高集合查询效率。 当往一个集合插入多个文档后,每个文档经过存储殷引擎后,有一个位置信息,通过这个位置信息。就能从存储引擎读出该文档。...MongoDB 索引类型 MongoDB 索引类型包括,单字段索引复合索引,多Key索引,文本索引等。...age:1})能够匹配复合索引前缀查询,也就是说类型 db.emp_res.find({name:"yy3"}) 同样可以通过该索引来加速,但是 db.emp_red.find({age:1}) 就无法使用复合索引...db.person.find( {habbit: "football"} 索引额外属性 唯一索引:保证索引对应字段不会出现相同值,_id索引就是唯一索引 TTL索引:可以针对某个时间段,指定文档过期时间...执行计划 索引快慢,可以根据索引执行计划查看相关信息。 db.emp_res.find({"name":"yy5"}).explain() 没建立索引执行COLLSCAN, 全表扫描 ?

67831

【翻译】MongoDB指南CRUD操作(四)

一个查询模型由查询、排序、投影规范组合构成。如果一个给定查询模型存在索引过滤器,优化程序只考虑索引过滤器中指定那些索引。 当查询模型存在索引过滤器时,MongoDB 忽略hint()方法。...MongoDB 提供了手动移除过滤器命令。 因为索引过滤器优先于优化程序预期行为和hint() 方法,所以谨慎地使用索引过滤器。...mongos ,即使_id字段不是片键,_id索引能覆盖查询。...然而可使用hint()方法强制MongoDB 使用指定索引使用hint() 支持性能测试,或者用于必须选择一个字段查询,或者用于必须选择被包含在几个索引字段查询。...使用增量操作符来执行服务端操作 使用MongoDB $inc操作符来增加或者减小文档值。

1.9K100

MongoDB CPU 利用率高解决方法

,将所有请求执行都记录到 system.profile 集合 针对慢请求 profiling,将超过一定阈值请求,记录到system.profile 集合 默认请求下,MongoDB profiling...功能是关闭,生产环境建议开启,慢请求阈值可根据需要定制,如不确定,直接使用默认值100ms。...集合 或者 日志文件发现 COLLSCAN 关键字时,就得注意了,很可能就是这些查询吃掉了你 CPU 资源;确认一下,如果这种请求比较频繁,最好是针对查询字段建立索引来优化。...> 关键字:COLLSCAN、 docsExamined CPU杀手2:不合理索引 有的时候,请求即使查询走了索引执行很慢,通常是因为合理建立不太合理(或者是匹配结果本身就很多,这样即使索引,...options 指定额外连接选项

95810

MongoDB 部分索引(Partial Indexes)

MongoDB部分索引只为那些在一个集合,满足指定筛选条件文档创建索引。由于部分索引是一个集合文档一个子集,因此部分索引具有较低存储需求,并降低了索引创建和维护性能成本。...部分索引通过指定过滤条件来创建,可以为MongoDB支持所有索引类型使用部分索引。..."ok" : 1 } 三、创建部分唯一索引一些限制 部分索引只为集合那些满足指定筛选条件文档创建索引。...: false } } ) 五、小结 a、部分索引就是带有过滤条件索引,即索引只存在与某些文档之上 b、满足过滤条件文档在查询时,其执行计划将使用该列上索引,否则不会被使用 c、...复合索引 MongoDB 多键索引 MongoDB执行计划获取(db.collection.explain()) MongoDB 唯一索引

1.6K00

MongoDB创建与删除索引对业务影响案例

跟传统数据库相同,为了提升查询效率,需要对集合增加适合索引,同样需要移除冗余、没有被使用索引,在MongoDB数据库日常运维过程如何规避创建与删除索引对系统影响?...4.2之前版本后台创建索引变成前台 4.2版本创建索引造成DB几分钟不能写 3.6版本创建索引后删除索引造成备库无法登录 【4.2之前版本后台创建索引变成前台】 MongoDB 4.2之前版本分为前台与后台...) 根据时间点去查找日志,发现有执行命令{profile:-1},这个命令对应DB级别锁是R.由此可以判断是这个命令导致创建索引所在DB下所有写入都被阻塞,锁队列类似-->IX-->R-->IX..... 1、【触发过程】 对大集合使用后台创建索引后,然后又删除这个相同索引,然后触发触发Secondary阻塞所有读情况,读写分离业务受到影响,不管是客户端还是shell命令行,以下shell命令行登录.... 3、[如何解决问题] 1、【等待备库创建完成索引后在主库删除索引】 4.2版本之前使用后台完成创建索引后,等待所有从库创建后,再执行删除索引. 2、【升级版本到4.2版本】

1.3K20

其实 MySQL like 关键字能用索引

上篇文章,松哥和大家分享了索引两个使用规则: 索引上不要使用函数运算。 使用覆盖索引避免回表。 当然,凡事有个度,用哪一种策略也要结合具体项目来定,不能为了 SQL 优化而抛弃了业务。...我们来看下执行计划: 可以看到,这里其实用到了 username 复合索引,通过 Extra 字段值还能看到使用到了覆盖索引。 为啥会这样呢?...最左匹配既可以是匹配复合索引前几个字段,可以是匹配第一个字段前几个字符,在上面的案例,我们匹配复合索引第一个字段。...当然我们可以匹配第一个字段前几个字符,如下: select username,age from user2 where username like 'j%'; 执行计划如下: 从这执行计划首先可以确认这个查询用到了...大家看到了,在上面的执行计划,like 'j%' 其实用到了索引,那么如果是 like '%j' 或者 like '%j%' 会用到索引吗?我们来看一个例子: 咦!看执行计划似乎用上索引了!

2.5K20

MySQL InnoDB 索引结构以及使用 B+ 树实现索引原因

InnoDB 是 MySQL 数据库中最常用存储引擎之一,它使用了 B+ 树索引结构来实现高效数据访问。在本篇文章,我们将介绍 InnoDB 索引结构以及为什么使用 B+ 树实现索引。...InnoDB 索引结构 在数据库索引是一种用于加快数据检索速度技术。常见索引结构包括 B-Tree、B+ Tree、Hash 等。...2、每个叶子节点都包含一个指向对应行数据物理地址(称作聚集索引)。 3、叶子节点之间通过指针进行连接,形成一个链表,方便范围查询操作。...2、支持排序和范围查找:由于所有叶子节点通过指针构成了一个有序链表,所以对于需要对数据进行排序和范围查找操作,可以通过顺序访问链表进行快速执行。...4、支持高并发:B+ 树分支节点值可以全部存放在内存,而且每个叶子节点固定只指向一个聚集索引,这样就使得这种索引结构使得并发处理效率高。

12310

MongoDB 稀疏(间隙)索引(Sparse Indexes)

稀疏索引(或者称间隙索引)就是只包含有索引字段文档条目,即使索引字段包含一个空值。也就是说间隙索引可以跳过那些索引键不存在文档。因为他并非包含所有的文档,因此称为稀疏索引。...一、间隙索引创建描述 稀疏索引(或者称间隙索引)就是只包含有索引字段文档条目,跳过索引键不存在文档 本文中后面的描述使用间隙索引 创建索引语法: db.collection.createIndex...在唯一索引,唯一索引会把null当做值,也就是说为null通常只能有一个。...b、间隙索引在创建时应指定选项:{ sparse: true } c、间隙索引列上可以指定唯一性约束 四、更多参考 MongoDB 单键(列)索引 MongoDB 复合索引 MongoDB...多键索引 MongoDB执行计划获取(db.collection.explain()) MongoDB 唯一索引 MongoDB 部分索引

2.5K40
领券