MongoDB Performance Advisor建议为careertest.sessions建索引,求含义说明
MongoDB索引建议说明
触发建议的背景
该建议是针对CareerTest库下sessions集合的过期数据清理操作生成的,触发建议的操作是使用以下条件的删除查询:
{expires: {$lt: 指定时间}}
该查询的作用是删除已经超过有效期的会话记录。
当前集合的索引现状
目前该集合仅存在1个默认的单字段索引:
_id: 1
没有匹配上述删除查询条件的专用索引。
现有配置的性能问题
没有expires字段索引的情况下,每次执行过期清理操作都会触发全表扫描:
- MongoDB需要遍历集合内的所有文档才能筛选出符合过期条件的记录
- 随着集合数据量增长,该操作的IO消耗、执行耗时会持续上升,严重时会拖慢其他业务请求的响应速度
建议索引的作用
为expires字段创建升序索引(即建议中提到的expires: 1)后:
- 清理操作可以直接通过索引定位到所有符合
$lt条件的过期文档,无需全表扫描,大幅降低操作的资源消耗和执行耗时 - 你也可以直接将该索引设置为TTL(生存时间)索引,MongoDB会自动在后台清理过期会话,无需手动调度删除任务,进一步降低维护成本
索引创建命令
普通索引创建命令(不开启自动TTL清理,仍由业务代码调度删除):
db.sessions.createIndex({expires: 1}, {background: true})
TTL自动清理索引创建命令(由MongoDB自动清理过期数据):
db.sessions.createIndex({expires: 1}, {expireAfterSeconds: 0, background: true})
添加background: true参数可以保证建索引过程中不会阻塞其他读写操作,降低对线上业务的影响。如果当前sessions集合数据量较大,建议选择业务低峰期执行建索引操作。
内容的提问来源于stack exchange,提问作者AndrewLeonardi
相关产品推荐
相关产品推荐

