第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. 定期分析和优化
相关推荐
ly76893 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
小羊没烦恼!4 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
注塑机数据采集联网4 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
黄俊懿4 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
geovindu4 小时前
sql: JSON and XML Data Handling in SQL using mysql 9.0
数据库·sql·mysql·数据库开发
hackchen4 小时前
LangChain 学习第 3 课 - 输出解析器(Output Parser)
数据库·学习·langchain
Mortalbreeze4 小时前
MySQL 基础篇(九):从 B+ 树到索引优化,全面理解 MySQL 索引
数据库·mysql
泡海椒4 小时前
JQuick-SQL SELECT 投影:字段、别名与表达式查询
数据库·sql
猫咪很可爱4 小时前
mysqldump 失败常见场景
数据库·sql·mysql
大明二代5 小时前
从零构建 Mastra RAG MVP:DeepSeek、SiliconFlow 与 PostgreSQL/pgvector 实战
javascript·数据库·人工智能