跳到主要内容

索引管理

索引是提升数据库查询性能的关键技术。通过为常用查询字段建立索引,可以显著提升查询速度和用户体验。

📋 管理入口

  1. 访问控制台:进入 CloudBase 控制台
  2. 选择数据库:切换到 数据库/文档型
  3. 进入索引管理:选择目标集合,点击 「索引管理」 标签页
  4. 管理索引:新建、删除或修改索引配置

🎯 索引类型详解

📌 单字段索引

适用场景:针对单个字段的查询和排序操作

特点说明

  • 支持嵌套字段索引,使用"点表示法"访问
  • 可指定升序或降序排序
  • 适合简单的单条件查询

示例配置

// 原始数据结构
{
"_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单独查询 namedb.collection('students').where({name: '张三'})
name, age查询 name + agedb.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": "北京市朝阳区"
}

索引创建

  1. 在控制台选择集合
  2. 进入索引管理页面
  3. 选择地理位置字段(如 location
  4. 设置索引类型为"地理位置索引"

查询示例

// 查询附近 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 字节将会报错。
注意

每个英文字母(不分大小写)占一字节的空间,每个中文汉字占两字节的空间。

正则表达式

正则查询无法使用索引提升性能。