索引的创建、查看与删除
索引的创建
在MongoDB中,索引是提高查询性能的关键。创建索引的基本语法是db.collection.createIndex()
。例如,在用户集合上为username
字段创建升序索引:
db.users.createIndex({ username: 1 })
复合索引可以包含多个字段,查询时会按照索引字段的顺序进行匹配:
db.orders.createIndex({ customerId: 1, orderDate: -1 })
MongoDB支持多种索引类型:
- 唯一索引:确保字段值唯一
- 文本索引:支持文本搜索
- 地理空间索引:支持地理位置查询
- 哈希索引:用于分片键
创建唯一索引的示例:
db.products.createIndex({ sku: 1 }, { unique: true })
TTL索引可以自动删除过期文档:
db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })
索引的查看
查看集合所有索引使用getIndexes()
方法:
db.orders.getIndexes()
输出结果会显示索引名称、键、类型等信息:
[
{
"v": 2,
"key": { "_id": 1 },
"name": "_id_"
},
{
"v": 2,
"key": { "customerId": 1, "orderDate": -1 },
"name": "customerId_1_orderDate_-1"
}
]
使用totalIndexSize()
查看索引占用的空间:
db.orders.totalIndexSize()
$indexStats
操作符可以获取索引使用统计:
db.orders.aggregate([ { $indexStats: { } } ])
索引的删除
删除单个索引使用dropIndex()
方法:
db.products.dropIndex("sku_1")
删除所有索引(除_id索引外)使用dropIndexes()
:
db.customers.dropIndexes()
重建索引可以优化索引性能:
db.orders.reIndex()
在分片集群中删除索引需要连接到mongos:
// 连接到mongos
shardConn = new Mongo("mongos.example.com:27017")
shardConn.getDB("mydb").orders.dropIndex("customerId_1")
索引管理实践
监控索引使用情况很重要,可以通过explain()
分析查询:
db.orders.find({ customerId: 123 }).explain("executionStats")
定期检查未使用的索引:
db.orders.aggregate([
{ $indexStats: {} },
{ $match: { "accesses.ops": { $lt: 100 } } }
])
部分索引只包含满足条件的文档:
db.users.createIndex(
{ active: 1 },
{ partialFilterExpression: { active: true } }
)
隐藏索引可以在不删除的情况下测试性能影响:
db.orders.hideIndex("customerId_1_orderDate_-1")
db.orders.unhideIndex("customerId_1_orderDate_-1")
索引性能优化
覆盖查询可以直接从索引返回结果:
db.users.createIndex({ name: 1, email: 1 })
db.users.find({ name: "张三" }, { _id: 0, email: 1 })
索引交集允许MongoDB组合多个索引:
db.products.createIndex({ category: 1 })
db.products.createIndex({ price: 1 })
db.products.find({ category: "电子", price: { $gt: 1000 } })
索引排序方向影响复合索引效率:
// 适合排序方向与查询方向一致的场景
db.logs.createIndex({ timestamp: -1 })
db.logs.find().sort({ timestamp: -1 })
索引前缀可以利用复合索引的部分字段:
db.orders.createIndex({ status: 1, orderDate: 1 })
// 可以使用status字段的索引
db.orders.find({ status: "shipped" })
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn