第4章:MongoDB索引

第4章:MongoDB索引

4.1 索引基础

4.1.1 索引的重要性

  • 提高查询性能
  • 减少集合扫描
  • 支持高效排序

4.1.2 默认索引

javascript 复制代码
// _id字段的默认索引
{
    "_id": ObjectId("..."),
    "name": "示例文档"
}

4.2 索引类型

4.2.1 单字段索引

javascript 复制代码
// 创建单字段索引
db.users.createIndex({username: 1})  // 升序
db.users.createIndex({username: -1}) // 降序

// 查看集合索引
db.users.getIndexes()

4.2.2 复合索引

javascript 复制代码
// 创建复合索引
db.users.createIndex({
    lastName: 1, 
    firstName: 1
})

// 复合索引查询
db.users.find().sort({
    lastName: 1, 
    firstName: 1
})

4.2.3 唯一索引

javascript 复制代码
// 创建唯一索引
db.users.createIndex(
    {email: 1}, 
    {unique: true}
)

// 部分唯一索引
db.users.createIndex(
    {username: 1},
    {
        unique: true,
        partialFilterExpression: {age: {$gt: 18}}
    }
)

4.2.4 文本索引

javascript 复制代码
// 创建文本索引
db.articles.createIndex(
    {content: "text"},
    {
        weights: {
            content: 10,
            tags: 5
        },
        name: "content_text_index"
    }
)

// 文本搜索
db.articles.find({
    $text: {$search: "MongoDB 数据库"}
})

4.2.5 地理空间索引

javascript 复制代码
// 创建2dsphere索引
db.places.createIndex({location: "2dsphere"})

// 地理位置查询
db.places.find({
    location: {
        $near: {
            $geometry: {
                type: "Point",
                coordinates: [116.4, 39.9]
            },
            $maxDistance: 1000
        }
    }
})

4.3 索引性能分析

4.3.1 查询执行计划

javascript 复制代码
// 分析查询性能
db.users.find({username: "example"}).explain("executionStats")

// 查看索引使用情况
db.users.find({username: "example"}).hint({username: 1})

4.3.2 索引选择策略

javascript 复制代码
// 创建复合索引
db.products.createIndex({
    category: 1, 
    price: -1
})

// 高效查询
db.products.find({
    category: "电子产品",
    price: {$gt: 1000}
}).sort({price: -1})

4.4 索引管理

4.4.1 索引操作

javascript 复制代码
// 删除指定索引
db.users.dropIndex({username: 1})

// 删除所有索引(除_id)
db.users.dropIndexes()

// 重建索引
db.users.reIndex()

4.4.2 后台创建索引

javascript 复制代码
// 后台创建索引(不阻塞写操作)
db.users.createIndex(
    {username: 1}, 
    {background: true}
)

4.5 常见索引问题

4.5.1 索引开销

  • 写入性能下降
  • 额外存储空间
  • 定期评估和调整

4.5.2 最佳实践

  1. 仅为常用查询创建索引
  2. 避免过多索引
  3. 使用复合索引替代多个单字段索引
  4. 定期分析和优化
相关推荐
山林竹笋4 分钟前
Java解析PDF数据库设计文档
数据库·pdf
Aimin202220 分钟前
Kali系统(Debian 10.3) 遇到的问题
数据库·mysql·debian
Run Out Of Brain23 分钟前
使用systemd管理MySQL服务器
服务器·数据库·mysql
小怪兽ysl1 小时前
【Oceanbase数据库常用巡检SQL】
数据库·sql·oceanbase
qq_420482631 小时前
飞书机器人告警实现
服务器·数据库·飞书
东方未明01081 小时前
Redis(三)单线程架构介绍
数据库·redis·数据库架构·单线程架构
代码的奴隶(艾伦·耶格尔)1 小时前
redis(1)
数据库·redis·缓存
q567315231 小时前
Django外键模型未保存引用
数据库·django·sqlite
꧁坚持很酷꧂2 小时前
Qt天气预报系统界面关闭
开发语言·数据库·qt
代码欢乐豆2 小时前
Neo4j的部署和操作
数据库·oracle