第九章 联合索引(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 集合,包含了 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})
口诀:联合索引顺序的相反数,可以使用索引,反之,不行。
假如创建一个 {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}
本文介绍了MongoDB的联合索引,包括创建方法、索引排序和前缀匹配。联合索引顺序对查询效率至关重要,正确的顺序能优化排序操作。同时,文章探讨了索引前缀的概念,解释了如何利用索引前缀进行查询优化。
138

被折叠的 条评论
为什么被折叠?



