- 使用select查询指定需要的列,而非查询全部列。如:
User.select(:id, :name).first
- 使用includes预加载关联对象,而非使用joins。如:
Post.includes(:comments).where("comments.created_at > ?", 1.week.ago)
- 使用joins时,仅保留必要的关联表,并使用条件限制查询结果。如:
Order.joins(:line_items => :product).where("products.category_id = ?", 5)
- 避免使用复杂的查询,或分解查询成多个简单的查询。如:
# 复杂查询
User.where("id IN (?) AND created_at < ? OR email LIKE ?", [1, 2, 3], 1.week.ago, "%example.com%")
# 分解成多个查询
User.where(id: [1, 2, 3]).where("created_at < ?", 1.week.ago).where("email LIKE ?", "%example.com%")
- 使用索引优化查询性能,可使用ActiveRecord的add_index方法添加索引。如:
add_index :products, :category_id