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

MongoDB 复合索引

MongoDB支持复合索引,即将多个键组合到一起创建索引。该方式称为复合索引,或者也叫组合索引,该方式能够满足多键值匹配查询使用索引的情形。其次复合索引在使用的时候,也可以通过前缀法来使用索引。...MongoDB中的复合索引与关系型数据库基本上一致。在关系型数据库中复合索引使用的一些原则同样适用于MongoDB。本文主要描述MongoDB复合索引。.../leshami/article/details/53541978 2、复合索引的一些特性 复合索引可以支持要求匹配多个键的查询 复合索引每一个键的顺序非常重要,这将决定该索引在查询过程中能否被使用到...复合索引支持前导(缀)列索引查询 不能够创建基于哈希索引类型的复合索引 任意复合索引字段不能超过31个 二、复合索引示意图 如下图所示,在集合的userid..."ok" : 1 } 3、复合索引与排序 复合索引创建时按升序或降序来指定其排列方式。

2.9K10

mysql复合索引、普通索引总结

( 转 ) mysql复合索引、普通索引总结 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)....所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。...如:建立 姓名、年龄、性别的复合索引。 ? 复合索引的建立原则: 如果您很可能仅对一个列多次执行搜索,则该列应该是复合索引中的第一列。...请注意,创建复合索引应当包含少数几个列,并且这些列经常在select查询里使用。在复合索引里包含太多的列不仅不会给带来太多好处。...而且由于使用相当多的内存来存储复合索引的列的值,其后果是内存溢出和性能降低。 复合索引对排序的优化: 复合索引只对和索引中排序相同或相反的order by 语句优化。

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

MongoDB复合索引详解

摘要: 对于MongoDB的多键查询,创建复合索引可以有效提高性能。 什么是复合索引复合索引,即Compound Index,指的是将多个键组合到一起创建索引,这样可以加速匹配多个键的查询。...不妨通过一个简单的示例理解复合索引。...但是,IXSCAN使用的是name与age的复合索引;FETCH即根据索引去查询文档,不需要过滤。 这个示例的数据量太小,并不能看出什么问题。...创建复合索引 没有为projectId和createAt创建复合索引是个尴尬的错误,赶紧补救一下: db.events.createIndex({projectId:1,createTime:-1},{...对比使用复合索引前后的结果,发现totalDocsExamined从28338降到了0,表示使用复合索引之后不再需要去查询文档,只需要扫描索引就好了,这样就不需要去访问磁盘了,自然快了很多。

1.2K40

优化MongoDB复合索引

如何修改索引,才能使得nscanned = nscannedObjects = n呢?我们可以尝试把anonymous字段也加到timestamp索引里,构成一个复合索引。 ?...聪明的读者可能猜到了,如果我们把复合索引的字段顺序颠倒一下,似乎就可以达到这个目标了。我们把索引顺序从 (timestamp,anonymous)变成(anonymous,timestamp)。 ?...和所有数据库一样,字段的顺序在MongoDB的复合索引中至关重要。如果索引以anonymous字段为前缀,Mongo可以直接跳到非匿名评论对应的记录。...总结 针对一个包含等式过滤,范围过滤和排序字段的查询,建立的复合索引的字段优先级,可以参考下面的规则 将所有等式过滤字段放在复合索引中最靠前的部分。 其次放入排序字段。...最后,如果一张表上有多个索引,有时业务指定Hint可能会比MongoDB使用查询优化器选择的索引更好。 讲完了,对于包含多个字段的复杂查询,建立复合索引是需要技巧的。希望本篇文章能够帮助到你。

2.8K20

优化MongoDB复合索引

如何修改索引,才能使得nscanned = nscannedObjects = n呢?我们可以尝试把anonymous字段也加到timestamp索引里,构成一个复合索引。 ?...聪明的读者可能猜到了,如果我们把复合索引的字段顺序颠倒一下,似乎就可以达到这个目标了。我们把索引顺序从 (timestamp,anonymous)变成(anonymous,timestamp)。 ?...和所有数据库一样,字段的顺序在MongoDB的复合索引中至关重要。如果索引以anonymous字段为前缀,Mongo可以直接跳到非匿名评论对应的记录。...总结 针对一个包含等式过滤,范围过滤和排序字段的查询,建立的复合索引的字段优先级,可以参考下面的规则 将所有等式过滤字段放在复合索引中最靠前的部分。 其次放入排序字段。...最后,如果一张表上有多个索引,有时业务指定Hint可能会比MongoDB使用查询优化器选择的索引更好。 讲完了,对于包含多个字段的复杂查询,建立复合索引是需要技巧的。希望本篇文章能够帮助到你。

2.7K30

索引(index)_普通索引、唯一索引复合索引.索引查询

这是因为:创建主键的时候自动给主键添加了索引,且该索引为唯一性索引。 即主键一定是唯一性索引。 但是一张表中可以有多个唯一性索引,所以唯一性索引不一定是主键。...DROP INDEX ind_user_info_name ON user_info; DROP INDEX uni_user_info_pass ON user_info; 创建一个唯一性复合索引:...CREATE UNIQUE INDEX uni_user_info_pass ON user_info(name,pass); 然后执行插入操作: 在这里因为是复合索引,只有当任意两条数据name-pass...关于普通复合索引index这里就不再详细执行截图描述,只需要注意下面这形式的索引意义就OK了!!!!...当建立复合索引index(column1,column2,column3),这就相当于建立了以下三个索引: index(column1), index(column1,column2) index(column1

1K40

【推荐】mysql联合 索引(复合索引)的探讨

Mysql联合 索引(复合索引)的使用原则 命名规则:表名_字段名 需要加索引的字段,要在where条件中。 数据量少的字段不需要加索引。最窄的字段放在键的左边。...只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。...查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效 率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。...因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。...3,索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。

2.5K20

巧用复合索引,有效降低系统IO

我们知道索引至关重要,合理的索引使用能够在很大程度上改善数据库的性能。然而很多人都会走入这样一个误区:走索引的SQL语句的性能一定比全表扫描好。真的是这样吗?...今天我们将围绕B*Tree索引的使用,解读如何合理地使用索引,以及如何通过正确的索引来提高性能。...接下来我们继续测试: 以下是单列索引,对之前的查询条件做了修改: ? 查看执行计划: ? 此时物理读为3994. 创建复合索引,并再次执行相同操作: ? 再次查看执行计划: ?...说明复合索引的效率在合理的场景下效率更高。 但是索引真的是万能的吗?我们继续测试 在没有索引的情况下修改查询条件执行以下语句: ? 查看执行计划: ? SQL走全表扫,物理读36111....所以,并不是所有使用索引的SQL性能都比全表扫描好。 前面分析到,在某些场景下,如何使用适当的复合索引,能够很大程度提高性能。那么接下来我们将通过真实案例来说明,如何创建高性能的复合索引

81290

明理知意:复合索引优化及索引访问原理

很显然,如果我们建立一个复合索引,那么索引扫描返回的行数将大大减少,这样也就大大减少了在表上访问并进行过滤的数据量。...以STAFF_ID列为前导列与CREATE_DATE列一起建立复合索引后,系统马上恢复正常。不过,有人会问,为什么要使用STAFF_ID列做索引的前导列,而不用CREATE_DATE列做前导列?...很多文档不是介绍说,复合索引要把选择性最好的列放在最前面吗?要回答这个问题,得首先了解索引的基本原理,包括Oracle数据库对索引是如何存储的、是怎样通过索引来检索索引数据的。...这种设计,能够使分枝节点存储更多的条目,减少了分枝节点数,特别是在多列复合索引中,对于很大的表,甚至可以减少B Tree树的高度。...由于Oracle索引的这个特性,使得IS NULL这种条件的SQL不能够使用索引。但是我们可以通过建复合索引的形式来使这种SQL也能够使用索引

98670

MySQL复合索引和单列索引的单表查询分析

通过上面表格,我们会发现,复合索引( name, age, nickname)和它们三列的单个索引是有区别的(该案例不做复合索引和单列索引的性能分析)主要区别有以下几点: 复合索引中,只有最左边的一列单独使用才会触发索引...通过分析我们可以发现,几个列的复合索引,就相当于 有几个索引,如复合索引( name, age, nickname)相当于 name 索引、( name, age)索引以及( name, age, nickname...) 索引(注意,后面两个索引不能再按复合索引算,只是为了解释说明)。...单表复合索引的性能分析 ?...然后第四行是使用了复合索引的第一列 name 和非复合索引中的列作为查询条件,rows 同样是2,非相连的两列作为查询条件时,复合索引相当于使用了第一列作为查询条件。

1.3K10

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

,但是我查询要按降序,我只需要从右端开始遍历即可满足需求,反之亦然 MIN 0 1 2 3 4 5 6 7 MAX MongoDB的复合索引结构 官方介绍:MongoDB supports compound...复合索引结构示意图如下所示: ? 该索引刚好和我们讨论的是一样的,userid顺序,score倒序。 我们需要直面第二个问题:复合索引在使用时需不需要在乎方向?...,所以需要从左侧开始遍历 从倒序顺序中找小于某个值的数据,势必会扫描很多无用数据,然后丢弃,当前场景下找大于某个值才是最佳方案 所以MongoDB为了更多场景考虑,在该种情况下,放弃了复合索引,选用其他的索引...db.sku_main.ensureIndex({"orgCode": 1, "_id": -1},{background:true}); 犯的错误一模一样,所以MongoDB放弃了复合索引的使用,...、索引的方向) MongoDB数据库单列索引可以不在乎方向,如对无索引字段排序需要控制数据量级(32M) MongoDB数据库复合索引在使用中一定要注意其方向,要完全理解其逻辑,避免索引失效

1.1K30

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

,但是我查询要按降序,我只需要从右端开始遍历即可满足需求,反之亦然 MIN 0 1 2 3 4 5 6 7 MAX MongoDB的复合索引结构 官方介绍:MongoDB supports compound...复合索引结构示意图如下所示: 该索引刚好和我们讨论的是一样的,userid顺序,score倒序。 我们需要直面第二个问题:复合索引在使用时需不需要在乎方向?...,所以需要从左侧开始遍历 从倒序顺序中找小于某个值的数据,势必会扫描很多无用数据,然后丢弃,当前场景下找大于某个值才是最佳方案 所以MongoDB为了更多场景考虑,在该种情况下,放弃了复合索引,选用其他的索引...db.sku_main.ensureIndex({"orgCode": 1, "_id": -1},{background:true}); 犯的错误一模一样,所以MongoDB放弃了复合索引的使用,该为单列索引...、索引的方向) MongoDB数据库单列索引可以不在乎方向,如对无索引字段排序需要控制数据量级(32M) MongoDB数据库复合索引在使用中一定要注意其方向,要完全理解其逻辑,避免索引失效 最后 如果你觉得这篇内容对你挺有帮助的话

1.4K20

死锁案例--(添加联合索引复合索引,以及添加普通索引使其走二级索引)

,也就是B+树的叶子节点存储了主键索引以及数据行;InnoDB的二级索引的叶子节点存储的则是主键值,所以通过二级索引查询数据时,需要根据查询到的主键去聚簇索引中再次进行查询。...,所以在操作时会全表扫描导致锁整个表,可以通过建普通索引或者建(复合索引,联合索引{自己认为的})进行优化。...6 修改主键和其中一个字段为复合索引mysql> show create table t;+-------+-----------------------------------------------...sec)Records: 9 Duplicates: 0 Warnings: 0mysql> alter table t add primary key(id,cnt); //设置复合主键...----------------------------------------------------------------+1 row in set (0.00 sec)联合主键体现在多个表上,复合主键体现在一个表中的多个字段完结

1.5K10

Mysql的复合索引,生效了吗?来篇总结文章

认识复合索引 如果where条件中使用到多个字段,并且需要对多个字段建立索引,此时就可以考虑采用复合索引(组合索引)。...缺点: 索引字段越多,创建的索引越多,每个索引都会增加磁盘空间的开销; 索引越多对查询效率提升越高,但对需要更新索引的增删改操作会有效率影响; 复合索引使用建议:单表最好不要超过1个复合索引,单个复合索引最好不超过...字段顺序的影响 复合索引遵从最左匹配原则,那么在where查询条件中的字段是否也需要按照索引的顺序来写呢? 比如,复合索引为(c1,c2,c3),下面两个查询条件是否会对索引有影响呢?...复合索引可以替代单一索引吗? 单一索引:(c1),复合索引:(c1,c2)。 当c1作为查询条件时,单一索引复合索引查询速度几乎一样,甚至比复合索引还要略快。...如果仅用复合聚集索引的非起始列(c2)作为查询条件的话,复合索引是不起任何作用的。 对于一张表来说,如果有复合索引(c1,c2),则无需再建单一索引(c1)。

75020

【云和恩墨大讲堂】复合索引与绑定变量

可能有以下三种方案: 1、 serviceID+enddate复合索引 2、 enddate+serviceID复合索引 3、 enddate的单列索引 我们在创建索引的时候有以下原则: 核心业务...、enddate两列如何创建复合索引 我们首先来看serviceID+enddate的复合索引 这个索引索引范围扫描的过程中消耗的逻辑读是33,回表次数达到373。...接下来是enddate+serviceID的复合索引: 这个在索引范围扫描的过程消耗的逻辑读是873,回表次数是1213次。 为什么两者的索引范围扫描消耗的逻辑读相差这么大。我们来看看谓词部分。...前者serviceid+enddate复合索引索引范围扫描全部走access,access就是说我在索引范围扫描的时候,在扫描页块节点中是不存在多余的页块的,也就是扫描的每一个叶块都是满足SQL的谓词条件的...(比如范围、like等)时复合索引应该尽量选择where条件中等值条件列作为索引的前导列。

1K60

【DB笔试面试549】在Oracle中,单列索引复合索引分别是什么?

♣ 题目部分 在Oracle中,单列索引复合索引分别是什么? ♣ 答案部分 按照索引列的个数,索引可以分为单列索引复合索引。单列索引是基于单个列所建立的索引。...复合索引(Composite Indexes),也称为连接索引、组合索引或多列索引,是在某个表中的多个列上建立的索引复合索引中的列应该以在检索数据的查询中最有意义的顺序出现,但在表中不必是相邻的。...若WHERE子句引用了复合索引中的所有列或前导列,则复合索引可以加快SELECT语句的数据检索速度。所以,在复合索引的定义中所使用的列顺序很重要。一般情况下,把最常被访问和选择性较高的列放在前面。...复合索引适合于单列条件查询返回多、组合条件查询返回少的场景。需要注意的是,创建复合索引可以消除索引回表读的操作,所以,在很多情况下,DBA通过创建复合索引来提高查询SQL的性能。...在Oracle中,可以使用视图DBA_IND_COLUMNS来查询复合索引索引列。

1.6K10

使用bash编写Linux shell脚本--复合命令

复合命令是将命令封装在一组其他命令中。 从可读性来说,封装后的命令使用缩进格式将会使复合命令的代码清晰并便于阅读。...复合命令总是有两个命令组成。命令的结束符是该命令相反拼写顺序,就像使用括号将命令括住了。例如:神秘莫测的命令 esac 实际上是复合命令 case 的结束符。...命令状态码 每一个 Linux 命令都返回一个状态码(退出状态),他是一个 0~255 之间的数字,用来表示该命令遇到的问题。...非官方的 Linux 惯例使用状态码 127 并且比标准的错误代码要小。例如: ls 返回了状态码 9 ,它表示“ bad file number ”。完整的错误代码列在附录 D :“错误代码”中。...printf “$SCRIPT:$LINENO: the command $who is not available – “/ “ aborting/n “ >&2 exit 192 fi 一般,大部分 Linux

2.3K101
领券