【MongoDB】索引之复合索引
本章内容:
- 创建复合索引
- 排序
- 前缀
- 索引交集
- 其他注意事项
MongoDB支持复合索引(compound indexes),一个复合索引包含对集合文档中多个字段[1]的引用。下图说明了两个字段上的复合索引的示例:
[1] MongoDB的复合索引限制在32个字段以内。
复合索引可以支持在多个字段上匹配查询。
一、创建复合索引
要创建复合索引,可以使用如下的操作模版:
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )
在索引规范中,该字段的值描述了字段的索引类型。例如,值1指定一个索引,该索引按升序对记录条目进行排序。值-1指定一个索引,该索引按降序对记录条目进行排序。有关其他索引类型,请参见索引类型。
重要
不能创建具有哈希索引类型的复合索引。如果尝试创建包含哈希索引字段的复合索引,则会收到错误消息。
考虑一个叫products的集合,其中包含与以下内容相似的文档:
{"_id": ObjectId(...),"item": "Banana","category": ["food", "produce", "grocery"],"location": "4th Street Store","stock": 4,"type": "cases"}
以下操作在item 和 stock字段上创建一个升序索引:
db.products.createIndex( { "item": 1, "stock": 1 } )
复合索引中的字段顺序很重要。索引将包含对文档的引用,这些文档首先按item字段的值排序,然后在item字段的每个值内,按stock字段的值排序。有关更多信息,请参见排序顺序。
除了支持在所有索引字段上都匹配的查询之外,复合索引还可以支持在索引字段的前缀(索引起始子集)上匹配的查询。也就是说,索引支持对item字段以及item字段和stock字段的查询:
db.products.find( { item: "Banana" } )db.products.find( { item: "Banana", stock: { $gt: 5 } } )
有关详细信息,请参见前缀。
二、排序
索引以升序(1)或降序(-1)排序顺序存储对字段的引用。对于单字段索引,字段的排序顺序无关紧要,因为MongoDB可以在任一方向上遍历索引。但是,对于复合索引,排序顺序可能会决定索引是否可以支持排序操作。
比如一个叫events的集合,其中包含带有username 和 date字段的文档。应用程序发起查询操作,查询返回的结果首先是按username值进行升序排序,然后按date值进行降序(即从最新到最后)排序,例如:
db.events.find().sort( { username: 1, date: -1 } )
或查询返回结果首先按username值降序,然后按date值升序排序,例如:
db.events.find().sort( { username: -1, date: 1 } )
以下索引可以支持这两种排序操作:
db.events.createIndex( { "username" : 1, "date" : -1 } )
但是,以上索引不能支持按username值升序,然后按date值升序排序,例如:
db.events.find().sort( { username: 1, date: 1 } )
有关排序顺序和复合索引的更多信息,请参见使用索引对查询结果进行排序。
三、索引前缀
索引前缀是索引字段的起始子集。例如,考虑以下复合索引:
{ "item": 1, "location": 1, "stock": 1 }
索引具有以下索引前缀:
- { item: 1 }
- { item: 1, location: 1 }
对于复合索引,MongoDB可以使用索引来支持对索引前缀的查询。这样,MongoDB可以将索引用于以下字段的查询:
- item 字段,
- item 和 location 字段,
- item 和location和 stock 字段.
MongoDB还可以使用索引来支持对item 和 stock字段的查询,因为item字段属于前缀。但是,该索引在支持查询方面不如仅基于item和stock的索引有效。
但是,MongoDB无法使用复合索引来支持包含以下字段的查询,因为如果没有item字段,则列出的任何字段都不对应于前缀索引:
- location 字段,
- stock 字段,或
- location 和stock 字段。
如果您的集合同时具有复合索引和前缀索引(例如{
a:
1,
b:
1
} 和{
a:
1
}),如果两个索引都不具有稀疏约束或唯一约束,则可以删除前缀上的索引(例如{
a:
1
})。 MongoDB在所有使用前缀索引的情况下都将使用复合索引。
四、索引交集
从2.6版开始,MongoDB可以使用索引交集来完成查询。 创建支持查询的复合索引还是依赖索引交集之间的选择取决于系统的具体情况。 有关更多详细信息,请参见索引交集和复合索引。
五、其他注意事项
参考上篇《单字段索引》的【五、其他注意事项】。
上一篇:单字段索引
【MongoDB】索引之复合索引相关推荐
- Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面、索引行复合索引中的一个切面
Pandas中xs()函数索引复合索引数据的不同切面数据(索引复合索引中需要的数据):索引列复合索引中的一个切面.索引行复合索引中的一个切面 目录
- Pandas把dataframe的索引、复合索引变换为数据列:包含单索引到单列(重命名)、复合索引到多数据列、复合索引的其中一个水平变换为数据列、
Pandas把dataframe的索引.复合索引变换为数据列:包含单索引到单列(重命名).复合索引到多数据列.复合索引的其中一个水平变换为数据列 目录
- is NULL , is NOT NULL 有时索引失效 || in 走索引, not in 索引失效 ||单列索引和复合索引 || 查看索引使用情况
is NULL , is NOT NULL 有时索引失效 in 走索引, not in 索引失效 单列索引和复合索引 尽量使用复合索引,而少使用单列索引 数据库会选择一个最优的索引(辨识度最高索引)来 ...
- php复合索引,关于复合索引和单独索引的一个问题
复合索引 1,shopid ctime EXPLAIN SELECT COUNT(*) FROM dc_order_menu_log WHERE shopid = 12 AND ctime > ...
- MySQL单列索引与复合索引选择
单列索引和复合索引. 尽量使用复合索引,而少使用单列索引 . 创建复合索引 create index idx_name_sta_address on tb_seller(name, status, a ...
- 单一索引和复合索引区别及联系
单一索引和复合索引区别及联系 - BABY的日志 - 网易博客 http://selectgoodboy.blog.163.com/blog/static/103212061201519111711 ...
- 数据库查询索引(sql单个索引和复合索引)
数据库查询索引(sql单个索引和复合索引)http://www.bieryun.com/3380.html 当一条sql语句的查询涉及到多个字段,这个时候给每个字段加索引,数据库也只能够使用其中的一个 ...
- 联合索引(复合索引)和单个索引
背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引 ...
- 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系
B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一.索引的数据结构可以是树,也可以是哈希表.常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提.本文旨在梳理 ...
- oracle 复合索引原则,复合索引在什么情况下使用
http://topic.csdn.net/t/20060813/16/4946416.html 1.复合索引使用的目的是什么? :能形成索引覆盖,提高where语句的查询效率 2.一个复合索引是否可 ...
最新文章
- Internet Explorer 已停止工作 解决办法
- Java的i =i_java中i = i++和i =++i的深入讲解
- session_start() [function.session-start]
- Flyme6系统适配教程(Patchrom)
- Linux - How to Extend/Reduce LVM’s (Logical Volume Management) in Linux
- 【渝粤题库】陕西师范大学189101 消费者行为学Ⅰ 作业(高起专)
- 【PyTorch】PixelShuffle
- ❤️《网络编程从入门到入魔》(建议收藏)❤️
- Crystal Report制作使用
- Scala学习(二、控制结构)
- squid服务的应用 转
- win7(win10)更改“文件类型显示图标“的终极修改方法
- 常用数学符号的英文读法
- 基于安卓的视频遥控小车——红外遥控部分
- “ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问” 问题解决办法
- 服务器和PC Server介绍
- RepVGG: Making VGG-style ConvNets Great Again
- 案例分析——2020春HIT网络与社会导论
- 用一封邮箱定位对方的位置
- 红旗linux系统qq,如何在红旗Linux系统redflag6.0上安装QQ