【发布时间】:2021-01-23 16:42:46
【问题描述】:
我有一个大型集合(约 20M 条记录),其中包含一些具有约 20 个索引字段的中等文档。所有这些索引都是单个字段。这个集合也有相当多的读写流量。
MongoDB 版本是 4.0.9。
我看到查询优化器在高峰期不断为获胜计划选择效率非常低的索引。
在示例查询中:
{
name: 'Alfred Mason',
created_at: { $gt: ... },
active: true
}
所有字段都被索引:
{ name: 1 }
{ created_at: 1 }
{ active: 1 }
当我运行explain() 时,获胜计划将使用created_at 索引,它将扫描~200k 个文档,然后返回与查询匹配的4。查询执行时间~6000 ms。
如果我使用$hint 强制使用name 索引,它将扫描6 个文档,然后返回与查询匹配的4。执行时间~2 ms。
为什么查询优化器总是选择最慢的索引?看起来很可疑,它只发生在高峰时段,当集合有更多的写入活动时,但确切的原因是什么?我该怎么办?
在生产环境中使用$hint 是否安全?
完全删除日期字段上的索引是否合理,因为$gt 查询似乎并不比 COLLSCAN 快?这可能会强制查询优化器使用索引字段。但话又说回来,它也可以选择另一个低效的索引(布尔字段)。
我不能使用复合索引,因为有很多用例使用所有 20 个可用索引的不同组合。
【问题讨论】:
标签: mongodb performance optimization indexing