面试题答案
一键面试索引结构设计
- 复合索引:对于多字段联合查询,应创建复合索引。例如,如果查询涉及字段
field1
、field2
和field3
,可创建索引{field1: 1, field2: 1, field3: 1}
。索引字段的顺序很关键,应按照查询条件中字段的过滤强度从高到低排列。过滤强度高的字段是指其值在数据集中的唯一性较高,能快速缩小查询范围。 - 覆盖索引:若查询结果仅包含索引中的字段,可创建覆盖索引。这样查询时无需回表操作,直接从索引中获取数据,提高查询效率。例如,查询只需要
field1
和field2
,可创建索引{field1: 1, field2: 1}
。
分片键选择
- 选择基数高的字段:基数是指字段不同值的数量。选择基数高的字段作为分片键,可使数据更均匀地分布在各个分片上。例如,使用
user_id
而不是gender
作为分片键,因为user_id
的不同值更多。 - 考虑查询模式:如果查询经常按照某个字段进行范围查询或排序,可考虑将该字段或包含该字段的复合字段作为分片键。例如,经常按
date
字段进行范围查询,可将date
作为分片键的一部分。
索引与分片协同优化
- 索引加速查询:索引能快速定位满足查询条件的数据所在的文档位置。在分片集群中,每个分片上都有自己的索引副本。当查询到达时,索引能快速过滤出满足条件的数据,减少每个分片需要扫描的数据量。
- 分片分散负载:合理的分片键选择确保数据均匀分布在各个分片上。这样在进行查询时,负载能分散到多个分片,并行处理查询,提高整体查询性能。例如,对于范围查询,不同分片可同时处理各自范围内的数据,最后将结果合并返回。
- 避免热点分片:合适的分片键和索引设计能避免某个分片成为热点。热点分片会导致性能瓶颈,而均匀的数据分布和高效的索引使用能保证各分片负载均衡,协同优化复杂查询的性能。