面试题答案
一键面试文档结构设计
- 嵌套与引用:
- 适当嵌套:如果数据具有紧密的关联性,例如一个订单文档包含订单详情,将订单详情直接嵌套在订单文档中,减少跨文档查询,提升读取性能。但嵌套深度不宜过深,否则会影响更新性能,因为更新嵌套文档时可能导致整个文档重写。
- 合理引用:对于关联但不紧密的数据,如用户与订单,可通过引用方式关联,在订单文档中存储用户的_id,这样能避免数据冗余,提升更新性能,但读取时可能需要额外的查询来获取关联数据。
- 数据扁平化:尽量避免多层嵌套,将常用数据放在文档顶层,减少查询时的深度遍历,提升查询效率。但可能会增加一定的数据冗余。
索引策略
- 单字段索引:针对频繁查询的字段创建单字段索引,如按用户ID查询订单,可在订单文档的用户ID字段上创建索引,能显著提升查询速度。但索引会占用额外的磁盘空间,且写入时会增加开销,因为每次写入都需要更新索引。
- 复合索引:当多个字段联合查询频繁时,创建复合索引,如按时间和用户ID查询订单,创建包含时间和用户ID的复合索引。注意复合索引字段顺序要与查询条件的顺序匹配,否则索引效果不佳。复合索引同样会增加空间和写入开销,且创建过多复合索引会导致索引维护成本剧增。
- 覆盖索引:若查询结果仅包含索引字段,可创建覆盖索引,查询直接从索引中获取数据,无需回表操作,大幅提升查询性能。但覆盖索引对索引构建要求较高,且同样会占用较多空间。
分片机制
- 选择分片键:
- 范围分片键:如按时间范围分片,适用于数据按时间有明显增长趋势的场景,能均匀分布数据,利于范围查询。但可能导致热点问题,如最近时间的数据写入频繁,会集中在某几个分片上。
- 哈希分片键:对分片键进行哈希运算来分配数据,能保证数据均匀分布,避免热点问题。但不利于范围查询,因为哈希后数据的顺序与原始数据顺序无关。
- 分片数量:合理规划分片数量,分片过少无法充分利用分布式优势,过多则会增加管理成本和网络开销。应根据数据量增长趋势和硬件资源提前规划,必要时可动态调整分片数量。
不同优化策略的权衡
- 文档结构方面:嵌套提升读取性能但影响更新,引用反之;扁平化减少查询深度但增加冗余,需在读写性能与数据冗余间权衡。
- 索引策略方面:各种索引提升查询性能,但都增加空间和写入开销,要在查询速度提升与资源占用间平衡,不能盲目创建过多索引。
- 分片机制方面:范围分片利于范围查询但可能有热点,哈希分片均匀分布但不利于范围查询,需根据业务查询特点选择分片键;同时要在分布式优势与管理成本间权衡,合理确定分片数量。