面试题答案
一键面试从索引角度的性能优化
- 分析查询模式:
- 深入了解应用的查询模式,确定高频查询的字段组合。例如,如果经常根据用户ID和时间范围进行查询,就应该创建包含用户ID和时间字段的复合索引。
- 使用
explain()
方法来分析查询计划,查看索引的使用情况,确保查询走了预期的索引。
- 单字段索引与复合索引:
- 单字段索引:适用于仅基于单个字段的查询。例如,如果经常根据商品价格进行查询,可以创建价格字段的单字段索引。
- 复合索引:当查询涉及多个字段的条件时,复合索引更为有效。在复合索引中,字段的顺序非常关键,按照查询条件中字段的选择性(区分度)从高到低排列。例如,查询条件为
{"user_id": 123, "status": "active"}
,如果user_id
的区分度更高,索引应定义为{"user_id": 1, "status": 1}
。
- 覆盖索引:
- 确保索引能够覆盖查询所需的所有字段。这样,MongoDB可以直接从索引中获取数据,而无需回表操作。例如,查询
{"title": "example", "author": "John"}
且只需要返回title
和author
字段,创建索引{"title": 1, "author": 1}
即可实现覆盖索引。
- 确保索引能够覆盖查询所需的所有字段。这样,MongoDB可以直接从索引中获取数据,而无需回表操作。例如,查询
- 索引维护:
- 定期使用
db.collection.reIndex()
来重建索引,以优化索引结构,特别是在数据大量删除或更新后。 - 使用
db.collection.dropIndex()
删除不再使用的索引,避免过多的索引占用内存和影响写入性能。
- 定期使用
索引命名规范辅助性能调优及运维管理
- 命名规则示例:
- 索引名应包含相关字段名和索引类型。例如,对于用户集合中根据
user_id
和last_login
创建的复合索引,命名可以为user_id_last_login_1_compound
,其中1
表示升序索引,若为降序则为-1
。 - 如果是唯一索引,可以在命名中体现,如
email_unique
表示email
字段的唯一索引。
- 索引名应包含相关字段名和索引类型。例如,对于用户集合中根据
- 性能调优辅助:
- 清晰的索引命名有助于快速识别索引用途。在分析查询性能时,通过索引名能快速判断是否存在合适的索引,以及是否需要调整索引结构。
- 当需要添加新索引时,根据命名规范能避免创建重复功能的索引。
- 运维管理辅助:
- 在进行数据库迁移或升级时,明确的索引命名便于确认索引是否正确迁移。
- 对于监控工具来说,通过索引名可以更好地展示索引的使用情况,如哪些索引被频繁使用,哪些索引长期未使用,从而指导索引的优化和清理工作。