MongoDB集合:复合索引与单字段索引的选型及性能疑问
MongoDB索引方案选择建议
针对你的查询场景,直接给出结论:推荐创建三个单字段索引{PortalId: 1}、{ContactId: 1}、{SelectionId: 1};如果ContactId+SelectionId的组合查询频率极高,可在三个单字段索引基础上额外添加复合索引{ContactId: 1, SelectionId: 1}。以下是具体分析:
两种方案的适配性对比
方案1:复合索引{ContactId:1, SelectionId:1} + 单字段索引{PortalId:1}
这个方案存在明显局限性:
- 仅
PortalId、仅ContactId、ContactId+SelectionId的查询可以用到对应索引; - 仅
SelectionId的查询无法利用复合索引(MongoDB复合索引遵循前缀匹配规则,必须从索引第一个字段开始匹配才能生效),这类查询会触发全表扫描,数据量越大性能越差。
方案2:三个单字段索引
这个方案能覆盖所有查询场景:
- 仅
PortalId、仅ContactId、仅SelectionId的查询各自对应单字段索引,都能高效执行; - 对于
ContactId+SelectionId的组合查询,MongoDB会自动使用索引交集,将两个单字段索引的结果合并,性能虽略逊于专门的复合索引,但足以应对大部分场景。若该组合查询调用频率极高,再额外添加复合索引即可进一步优化。
数据量增长时仅用复合索引的性能影响
如果只创建复合索引{ContactId:1, SelectionId:1}和PortalId单字段索引,仅SelectionId的查询会因无可用索引而走全表扫描。当数据量增长到十万、百万级甚至更高时,全表扫描需要遍历集合所有文档,查询耗时随数据量线性增长,读取性能会大幅下降,严重影响查询效率。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

