MST
星途 面试题库

面试题:Ruby on Rails性能优化之数据库查询优化

在Ruby on Rails项目中,数据库查询性能对整体性能影响很大。假设你有一个包含大量用户数据的应用,用户表关联了订单表。现在要获取每个用户及其最近的订单信息,如何优化这一查询以提升性能?请说明优化思路,并给出可能用到的Ruby on Rails代码片段。
42.5万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

优化思路

  1. 减少查询次数:使用 includes 方法进行预加载,避免N + 1问题。在这种情况下,通过预加载订单表,可以在一次数据库查询中获取用户及其关联订单的数据,而不是为每个用户单独查询订单。
  2. 添加索引:在订单表的 user_id 字段和 created_at 字段(用于获取最近订单)上添加索引,以加快查询速度。
  3. 限制查询字段:只选择需要的字段,减少数据传输量。

Ruby on Rails代码片段

假设我们有 User 模型和 Order 模型,并且它们之间有正确的关联关系(User has_many :ordersOrder belongs_to :user)。

# 添加索引
class AddIndexToOrders < ActiveRecord::Migration[6.0]
  def change
    add_index :orders, :user_id
    add_index :orders, :created_at
  end
end

# 获取每个用户及其最近的订单信息
users_with_recent_orders = User.includes(:orders).map do |user|
  recent_order = user.orders.order(created_at: :desc).first
  { user: user, recent_order: recent_order }
end

在上述代码中:

  1. 首先通过迁移文件添加了必要的索引。
  2. 然后在代码中使用 includes 方法预加载用户关联的订单。接着通过 map 方法遍历每个用户,并获取该用户按 created_at 降序排列的第一个订单(即最近订单)。最终返回一个包含用户及其最近订单信息的数组。