1. 基于TTL索引的方案设计
- TTL索引:在
device_data
集合的 timestamp
字段上创建TTL索引。TTL(Time To Live)索引会自动删除集合中已过期的文档,这里过期时间基于 timestamp
字段的值。
db.device_data.createIndex( { timestamp: 1 }, { expireAfterSeconds: 30 * 24 * 60 * 60 } );
- 索引组合:除了TTL索引外,考虑到查询近期设备状态的性能,可创建一个复合索引,以
device_id
和 timestamp
为字段,且 timestamp
为降序排列。这样在查询某个设备近期状态时,可利用该索引快速定位。
db.device_data.createIndex( { device_id: 1, timestamp: -1 } );
2. 配置与优化
- 存储引擎特性:MongoDB默认使用WiredTiger存储引擎。该引擎支持多线程读写,在数据量较大时性能表现较好。可通过调整
cacheSizeGB
参数来优化缓存使用,例如增加缓存大小以容纳更多热数据,提高查询性能。
- 数据查询与清理的平衡策略:
- 批量删除:虽然TTL索引会自动删除过期数据,但为了减少对正常查询的影响,可考虑在业务低峰期进行批量删除操作。通过查询获取过期数据的
_id
列表,然后批量删除这些文档。
var expirationDate = new Date(new Date().getTime() - 30 * 24 * 60 * 60 * 1000);
var cursor = db.device_data.find({timestamp: {$lt: expirationDate}}).batchSize(1000);
var idsToDelete = [];
cursor.forEach(function(doc) {
idsToDelete.push(doc._id);
});
db.device_data.deleteMany({_id: {$in: idsToDelete}});
- 查询优化:在查询近期设备状态时,尽量使用已创建的复合索引。例如查询某个设备最近的状态:
db.device_data.find({device_id: "your_device_id"}).sort({timestamp: -1}).limit(1);
- 监控与调整:定期监控数据库性能指标,如查询响应时间、索引使用情况等。根据监控结果调整TTL索引的过期时间、索引组合以及批量删除的频率等,以达到数据查询与清理的最佳平衡。