索引管理
索引是提升数据库查询性能的关键技术。通过为常用查询字段建立索引,可以显著提升查询速度和用户体验。
📋 管理入口
- 访问控制台:进入 CloudBase 控制台
- 选择数据库:切换到 数据库/文档型
- 进入索引管理:选择目标集合,点击 「索引管理」 标签页
- 管理索引:新建、删除或修改索引配置
🎯 索引类型详解
📌 单字段索引
适用场景:针对单个字段的查询和排序操作
特点说明:
- 支持嵌套字段索引,使用"点表示法"访问
- 可指定升序或降序排序
- 适合简单的单条件查询
示例配置:
// 原始数据结构
{
"_id": "product_001",
"name": "iPhone 15",
"price": 5999,
"style": {
"color": "深空黑",
"storage": "128GB"
}
}
索引配置示例:
字段路径 | 索引类型 | 排序方式 | 适用查询 |
---|---|---|---|
name | 单字段 | 升序 | 按商品名称查询 |
price | 单字段 | 降序 | 按价格排序 |
style.color | 单字段 | 升序 | 按颜色筛选 |
💡 提示:嵌套字段使用点表示法,如
style.color
表示访问 style 对象中的 color 字段。
🔗 组合索引
适用场景:多字段联合查询和复杂排序操作
核心概念:一个索引包含多个字段,支持前缀匹配查询
示例数据:
{
"_id": "student_001",
"name": "张三",
"age": 20,
"score": 85,
"class": "计算机科学"
}
索引前缀规则:
假设创建组合索引: name + age + score
索引前缀 | 能命中的查询组合 | 查询示例 |
---|---|---|
name | 单独查询 name | db.collection('students').where({name: '张三'}) |
name, age | 查询 name + age | db.collection('students').where({name: '张三', age: 20}) |
name, age, score | 查询全部字段 | db.collection('students').where({name: '张三', age: 20, score: 85}) |
💡 前缀匹配原理
组合索引 (name, age, score)
的前缀包含:
- ✅
name
- 可以命中索引 - ✅
name, age
- 可以命中索引 - ✅
name, age, score
- 可以命中索引 - ❌
age
- 无法命中索引(不是前缀) - ❌
score
- 无法命中索引(不是前缀) - ❌
age, score
- 无法命中索引(不是前缀)
组合索引的重要特性:
🔄 1. 字段顺序的重要性
索引字段的顺序直接影响查询性能:
索引定义 | 能命中的查询 | 无法命中的查询 |
---|---|---|
(name, age) | ✅ name 查询✅ name + age 查询 | ❌ 单独 age 查询❌ age + score 查询 |
(age, name) | ✅ age 查询✅ age + name 查询 | ❌ 单独 name 查询❌ name + score 查询 |
📊 2. 排序方向的影响
排序查询时,索引的排序方向会影响是否能命中索引:
索引配置: age: 升序, score: 降序
查询排序方式 | 是否命中索引 | 说明 |
---|---|---|
age: 升序, score: 降序 | ✅ 命中 | 与索引方向完全一致 |
age: 降序, score: 升序 | ✅ 命中 | 索引可反向使用 |
age: 升序, score: 升序 | ❌ 未命中 | 排序方向不一致 |
age: 降序, score: 降序 | ❌ 未命中 | 排序方向不一致 |
score: 任意, age: 任意 | ❌ 未命中 | 不符合前缀规则 |
索引配置: age: 升序, score: 升序
查询排序方式 | 是否命中索引 | 说明 |
---|---|---|
age: 升序, score: 升序 | ✅ 命中 | 与索引方向完全一致 |
age: 降序, score: 降序 | ✅ 命中 | 索引可反向使用 |
age: 升序, score: 降序 | ❌ 未命中 | 排序方向不一致 |
age: 降序, score: 升序 | ❌ 未命中 | 排序方向不一致 |
📍 地理位置索引
适用场景:地理位置查询、附近搜索、区域筛选
功能特点:
- 支持平面几何的地理位置索引
- 必须为地理位置字段建立专门的地理位置索引
- 支持点、线、面等几何图形
数据结构示例:
{
"_id": "store_001",
"name": "星巴克咖啡店",
"location": {
"type": "Point",
"coordinates": [116.4074, 39.9042] // [经度, 纬度]
},
"address": "北京市朝阳区"
}
索引创建:
- 在控制台选择集合
- 进入索引管理页面
- 选择地理位置字段(如
location
) - 设置索引类型为"地理位置索引"
查询示例:
// 查询附近 1000 米内的店铺
db.collection('stores').where({
location: db.command.geoNear({
geometry: db.Geo.Point(116.4074, 39.9042),
maxDistance: 1000
})
}).get()
索引使用注意事项
唯一性限制
创建索引时,索引属性选择唯一,即可添加唯一性限制。此限制会要求集合中索引字段对应的值不能重复。
例如,某个集合内建立了索引字段 foo
,且属性为“唯一”,那么在这个集合内,要求不能存在 foo
字段相同的文档。
注意
需特别注意的是,假如记录中不存在某个字段,则对索引字段来说其值默认为 null。如果索引有唯一性限制,则不允许存在两个或以上的该字段为空 / 不存在该字段的记录。
大小限制
- 索引的字段大小限制不能超过 1024 字节。
- 添加索引时,如果集合中已有文档索引字段超过 1024 字节,添加索引时将报错。
- 已设置索引的字段,如果插入一个文档,文档中该字段超过 1024 字节将会报错。
注意
每个英文字母(不分大小写)占一字节的空间,每个中文汉字占两字节的空间。
正则表达式
正则查询无法使用索引提升性能。