面试题答案
一键面试MongoDB索引基数概念
索引基数指的是索引字段中不同值的数量。例如,一个存储用户性别的索引字段,其基数可能只有2(男、女);而存储用户ID的索引字段,基数可能和文档数量相同,因为每个用户ID通常是唯一的。
索引基数对查询性能的影响
- 高基数索引:
- 对于高基数索引(如用户ID索引),MongoDB能够更精确地定位到符合查询条件的文档。这是因为每个索引项指向的文档相对较少,在执行查询时,数据库可以快速通过索引找到所需文档,从而显著提高查询性能。例如,当根据特定用户ID查询用户信息时,高基数的用户ID索引可以让MongoDB直接定位到对应的文档,减少了全表扫描的开销。
- 低基数索引:
- 低基数索引(如性别索引)虽然也能减少扫描范围,但由于不同值较少,索引的区分度较低。在查询时,可能需要扫描大量包含相同索引值的文档。例如,查询性别为“男”的用户,虽然索引能快速定位到性别为“男”的索引项,但可能会指向大量文档,数据库仍需对这些文档进行进一步过滤,性能提升相对有限。
可能导致性能问题的索引基数情况
- 极低基数索引用于频繁查询:
- 当索引基数非常低(比如只有1或2个不同值),且基于该索引的查询频繁发生时,可能会导致性能问题。例如,假设在一个文档集合中,有一个字段标记文档是否为“热门”(只有“是”和“否”两个值),如果频繁根据“是否热门”进行查询,由于基数低,索引无法有效过滤文档,数据库可能仍需要扫描大量文档,从而降低查询性能。
- 高基数索引维护成本过高:
- 虽然高基数索引通常对查询性能有益,但如果索引基数过高且数据频繁更新,维护索引的成本会变得很高。例如,一个自增ID作为索引字段,随着数据的不断插入,索引需要不断调整和扩展,这会消耗大量的系统资源,在极端情况下可能导致性能下降。