跳到主要内容

索引管理

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

如何创建索引

  1. 访问 云开发平台/数据库
  2. 进入索引管理:选择目标集合,点击索引管理标签页
  3. 管理索引:新建、删除或修改索引配置

索引管理界面

索引类型详解

单字段索引

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

特点说明:

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

示例配置:

// 原始数据结构
{
"_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 - 无法命中索引(不是前缀)

组合索引的重要特性:

字段顺序的重要性

索引字段的顺序直接影响查询性能:

索引定义能命中的查询无法命中的查询
(name, age)name 查询
name + age 查询
❌ 单独 age 查询
age + score 查询
(age, name)age 查询
age + name 查询
❌ 单独 name 查询
name + score 查询

排序方向的影响

排序查询时,索引的排序方向会影响是否能命中索引:

索引配置: age: 升序, score: 降序

查询排序方式是否命中索引说明
age: 升序, score: 降序✅ 命中与索引方向完全一致
age: 降序, score: 升序✅ 命中索引可反向使用
age: 升序, score: 升序❌ 未命中排序方向不一致
age: 降序, score: 降序❌ 未命中排序方向不一致
score: 任意, age: 任意❌ 未命中不符合前缀规则

索引配置: age: 升序, score: 升序

查询排序方式是否命中索引说明
age: 升序, score: 升序✅ 命中与索引方向完全一致
age: 降序, score: 降序✅ 命中索引可反向使用
age: 升序, score: 降序❌ 未命中排序方向不一致
age: 降序, score: 升序❌ 未命中排序方向不一致

地理位置索引

适用场景: 基于地理位置的查询,如附近商家、距离计算等。

创建步骤:

  1. 云开发平台/数据库 选择集合
  2. 进入索引管理页面
  3. 选择地理位置字段(如 location
  4. 设置索引类型为"地理位置索引"

查询示例:

详细文档请参考小程序 GEO 查询文档

const _ = db.command

db.collection('restaurants').where({
location: _.geoNear({
geometry: db.Geo.Point(116.4, 39.9),
minDistance: 1000,
maxDistance: 5000,
})
}).get()

地理位置索引示例

索引使用注意事项

唯一性限制

创建索引时,索引属性选择唯一,即可添加唯一性限制。此限制会要求集合中索引字段对应的值不能重复

例如,某个集合内建立了索引字段 foo ,且属性为“唯一”,那么在这个集合内,要求不能存在 foo 字段相同的文档。

⚠️ 注意:假如记录中不存在某个字段,则对索引字段来说其值默认为 null。如果索引有唯一性限制,则不允许存在两个或以上的该字段为空/不存在该字段的记录。

大小限制

  • 索引的字段大小限制不能超过 1024 字节
  • 添加索引时,如果集合中已有文档索引字段超过 1024 字节,添加索引时将报错
  • 已设置索引的字段,如果插入一个文档,文档中该字段超过 1024 字节将会报错

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

正则表达式查询

⚠️ 注意:正则表达式查询无法使用索引提升性能,建议在必要时使用全文索引替代。