第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 最佳实践
- 仅为常用查询创建索引
- 避免过多索引
- 使用复合索引替代多个单字段索引
- 定期分析和优化