面试题答案
一键面试- 数据量小的集合:
- 当集合中的数据量非常小,例如只有几十条或几百条记录时,MongoDB 可以快速遍历整个集合来找到所需的数据。此时使用索引,数据库不仅要维护索引结构(这需要额外的存储空间和处理开销),而且在查询时从索引中定位数据再到实际数据位置的过程,可能比直接全表扫描更耗时,从而导致性能下降。
- 写入频繁的场景:
- 每次插入、更新或删除文档时,如果文档字段上有索引,MongoDB 除了要更新数据本身,还需要更新相关的索引。这意味着额外的 I/O 操作和 CPU 计算。在高写入频率的业务场景下,例如日志记录系统,大量的索引更新操作会严重影响写入性能,使系统整体性能下降。
- 选择性差的字段:
- 若某个字段的取值范围很窄,例如性别字段(取值只有男和女两种),基于这样的字段创建索引,索引的选择性很差。查询时,索引可能指向大量文档,MongoDB 仍需要扫描大量数据,索引无法有效缩小查询范围,同时索引维护成本却依然存在,对性能提升有限甚至可能因维护索引而降低性能。
- 复合索引中不常使用的前缀:
- 对于复合索引,查询条件如果不包含索引的最左前缀字段,MongoDB 无法有效利用该复合索引。例如有一个复合索引
{field1: 1, field2: 1}
,如果查询仅基于field2
,那么这个复合索引基本无法发挥作用,而索引的维护成本却依然存在,可能拖累系统性能。
- 对于复合索引,查询条件如果不包含索引的最左前缀字段,MongoDB 无法有效利用该复合索引。例如有一个复合索引
- 查询条件复杂且索引不匹配:
- 当查询条件非常复杂,涉及多个字段的复杂逻辑运算(如
$or
操作符连接多个条件,且这些条件无法有效利用现有索引)时,MongoDB 可能无法选择最优的索引,甚至选择了错误的索引,导致查询性能不升反降。例如,$or
操作符连接的两个条件分别基于不同的索引字段,MongoDB 可能需要对多个索引进行扫描并合并结果,这个过程可能比直接全表扫描更慢。
- 当查询条件非常复杂,涉及多个字段的复杂逻辑运算(如