Rails最小化数据库负载

时间:2011-08-31 19:47:14

标签: ruby-on-rails ruby database optimization query-optimization

我对rails很新。我知道rails可以让你轻松地使用你的数据库值,但是我对于什么样的方法在数据库上更节能而哪些方法更加盲目。

以下是一个例子。我有一个模型约会,belongs_to用户。在我的语法中,我有时会说process_user @appointment.user当我写这个时,是否会在数据库上运行单独的SELECT查询来检索该用户?编写process_user @appointment.user_id更有效率,其中user_id是约会中的属性,然后尝试使用user_id值,只要我不需要整个用户对象@appointment.user,就可以执行与评估相关的任务。

坦率地说,从一个安心的角度来看,我只是喜欢能够使用process_user @appointment.user,因为它更好看,看起来更好,并且在准备逻辑时效果更好。这是一种高效的方式吗?

2 个答案:

答案 0 :(得分:1)

您可以急切地将关联用户加载到约会模型中:

Appointment.all(:include => :user)

...将加入用户或对单个查询中的所有关联用户进行单独查找。

这将提前加载用户关联(急切地),以便在您引用用户属性时已填充该对象,而不必停止并执行单独的查询以逐个查找(N + 1个查询)。

答案 1 :(得分:1)

使用process_user @appointment.user之类的代码完全没问题,因为ActiveRecord会尽量减少数据库查询的数量。当然它并不能很好地处理所有情况,但你的例子是一个非常基本的例子。可能不会立即发生数据库查询,只有在访问其属性时才会加载该对象。

如果您发现正在运行的大型应用程序中存在性能问题,并且您可以使用性能分析将问题跟踪到ActiveRecord,则可能需要进行优化。尝试从一开始就进行预优化将违背Rails的理念,并且只会导致丑陋(甚至可能更慢)的代码。请记住,真正的性能瓶颈通常出现在您从未预料到的地方。

编辑:正如Winfield指出的那样,优化查询数量通常并不意味着自己管理外键或类似的内部。 DB访问方法有很多标志和选项,可以控制数据库的查询方式。