MongoDB 创建索引原则
MongoDB索引创建原则
MongoDB索引是提高查询性能的关键工具,以下是创建索引的核心原则和最佳实践:
一、索引基础原则
1. 索引本质:索引类似书籍目录,通过B-Tree数据结构对字段值排序存储,使查询复杂度从O(n)降为O(logn)
2. 默认索引:所有集合在_id字段上自动创建唯一索引
3. 排序方向:单字段索引的升序(1)/降序(-1)不影响性能,MongoDB可双向遍历
二、索引类型选择
1. 单字段索引:适合高频查询的单个字段
db.products.createIndex({price: 1}) // 价格升序索引
2. 复合索引:多字段联合查询时使用,需注意字段顺序
db.orders.createIndex({customer_id:1, order_date:-1})
3. 多键索引:自动处理数组字段
db.blog.createIndex({tags:1})
4. 特殊索引:
- 唯一索引:db.users.createIndex({email:1}, {unique:true})
- TTL索引:db.logs.createIndex({createdAt:1}, {expireAfterSeconds:60})
三、创建原则
1. 高频查询优先:为经常出现在查询条件、排序、分组中的字段创建索引
2. 选择性原则:优先为高选择性(唯一/接近唯一)的字段建索引
3. 复合索引顺序:
- 等值查询字段放前面
- 范围查询/排序字段放后面
4. 空间权衡:复合索引比单字段索引占用更多空间和性能开销8
四、性能优化
1. 索引隐藏:4.4+版本支持先隐藏索引评估影响再删除
db.collection.hideIndex("index_name")
2. 索引管理:
- 查看索引:db.collection.getIndexes()
- 删除索引:db.collection.dropIndex(“index_name”)
- 数据类型优化:索引字段尽量使用NumberInt而非String类型
注意事项
>1. 写入开销:索引会降低写入性能,每个插入/更新需维护索引结构
>2. 内存占用:索引应能放入内存,否则性能会下降
>3. 避免过度索引:只为真正需要的查询创建索引,监控索引使用率
通过合理应用这些原则,可以在查询性能和写入开销之间取得平衡,显著提升MongoDB的查询效率。