第九章 联合索引(Compound Indexes)

本文介绍了MongoDB的联合索引,包括创建方法、索引排序和前缀匹配。联合索引顺序对查询效率至关重要,正确的顺序能优化排序操作。同时,文章探讨了索引前缀的概念,解释了如何利用索引前缀进行查询优化。

第九章 联合索引(Compound Indexes)

  • 创建联合索引
  • 排序
  • 前缀匹配

MongoDB 支持联合索引,联合索引的字段限制为 32个字段 。创建联合索引时,索引的顺序就显得比较重要了。

创建索引

你可以以下语法创建联合索引

db.collection_name.createIndex({<field>: <type>, <field>: <type>, ...})

当指定<type>为1时,意味着索引顺序是升序排序;<type>为-1时,意味着索引顺序降序。

重要
4.4版本

  • 联合索引可以包含一个哈希索引

4.2版本或更早版本

  • 联合索引不能包含哈希索引

假设这里有一个名叫 products 集合,其数据结构如下:

{
     "item": "Banana",
		 "category": ["food", "produce", "grocery"],
		 "location": "4th Street Store",
		 "stock": 5,
		 "type": "cases"
	},
	{
     "item": "Apple",
		 "category": ["food", "produce", "grocery"],
		 "location": "4th Street Store",
		 "stock": 3,
		 "type": "cases"
	},
	{
     "item": "Cherry",
		 "category": ["food", "produce", "grocery"],
		 "location": "4th Street Store",
		 "stock": 5,
		 "type": "cases"
	},
	{
     "item": "Banana",
		 "category": ["food", "produce", "grocery"],
		 "location": "4th Street Store",
		 "stock": 4,
		 "type": "cases"
	}

创建如下联合索引:

db.products.createIndex({"item": 1, "stock": 1})

联合索引字段的顺序是非常重要的。索引会首先根据第一个字段是排序,然后在第一个字段相同情况下,再根据第一个字段排序。

假设,我需要找到所有名为 Banana 水果,并根据 item 升序排序和 stock 排序。在没有联合索引时,我们需要使用 sort({...}) 进行排序;建立联合索引,按照 item 升序和 stock 升序查询,就不需要使用 sort({...})。查询语句如下:

db.products.find({"item": "Banana", "stock": {$lt: 10}})
索引排序(Sort Order)

索引排序顺序决定 sort({..}) 能否使用得上联合索引。

假设有一个 event 集合,包含了 usernamedate 字段。要返回结果根据 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})

口诀:联合索引顺序的相反数,可以使用索引,反之,不行

假如创建一个 {username: 1, date: 1} 的联合索引
db.events.find({}).sort({username: -1, date: -1}) -- 可以使用索引
db.events.find({}).sort({username: -1, date: 1}) -- 不行
db.events.find({}).sort({username: 1, date: -1}) -- 不行
索引前缀

假设有这样一个联合索引:

{"item": 1, "location": 1, "stock": 1}

该索引的前缀有以下两种:

  • {item: 1}
  • {item: 1, location: 1}

索引是顺序被解析的,如果查询忽略联合索引部分字段,不能使用到索引前缀有以下几种:

  • {location: 1}
  • {stock: 1}
  • {location: 1, stock}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值