面试题答案
一键面试模型层面
- 预加载关联数据
- 优化方案:在查询产品列表时,使用
includes
方法预加载Category
关联,如Product.includes(:category).where(category_id: target_category_id)
。 - 原理:避免 N + 1 问题,一次性加载所需的关联数据,减少数据库查询次数。
- 可能影响:会增加内存使用,因为一次性加载较多数据。
- 优化方案:在查询产品列表时,使用
- 减少不必要的关联回调
- 优化方案:检查
Product
模型中与Category
关联相关的回调方法,移除不必要的回调。 - 原理:回调方法会在模型操作时执行额外逻辑,减少不必要的回调可减少执行时间。
- 可能影响:如果移除了关键业务逻辑的回调,可能导致业务异常,需要谨慎处理。
- 优化方案:检查
数据库层面
- 索引优化
- 优化方案:在
Product
表的category_id
字段上创建索引,如add_index :products, :category_id
。 - 原理:索引可以加快数据检索速度,数据库通过索引能快速定位到符合条件的记录。
- 可能影响:增加索引会占用额外的磁盘空间,并且写操作(插入、更新、删除)会变慢,因为数据库需要同时更新索引。
- 优化方案:在
- 查询优化
- 优化方案:分析查询语句,确保查询条件合理。例如,避免在
category_id
字段上使用函数或表达式,因为这会使索引失效。 - 原理:数据库基于索引进行快速查询,若索引失效则会进行全表扫描,大大降低查询效率。
- 可能影响:可能需要调整业务逻辑以适应合理的查询条件写法。
- 优化方案:分析查询语句,确保查询条件合理。例如,避免在
- 分区表
- 优化方案:如果数据量持续增长,可以考虑对
Product
表按category_id
进行分区。 - 原理:将大表拆分为多个小的分区,查询时只需访问相关分区,减少数据扫描范围。
- 可能影响:增加数据库管理复杂度,如数据插入、删除等操作需要考虑分区规则。
- 优化方案:如果数据量持续增长,可以考虑对