rails 3 ...在这种情况下,两个查询比一个快两个?

时间:2011-02-06 07:09:46

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

我们几乎每次“击中”我们的网站都会这样做。在Heroku主持,运行Postgres。

非常常见的场景......我们模型中的单个方法获得匹配条件的COUNT条记录以及匹配相同条件的LAST记录。

在实际使用中,COUNT通常小于20.该表有大约20个字段,没有大于200个字符。

目前我做两个查询, n = widget.count(条件),然后我做 z = widget.last(条件)

但当然我也可以 allfound = widget.find(条件)然后得到n = allfound.count和z = allfound.last。

哪个“更好”?有什么权衡? (总是权衡,对吗?)

干杯! JP

2 个答案:

答案 0 :(得分:1)

我会坚持两个查询,因为:

  • 不要过早地优化 - 直到你需要优化它,坚持你需要做的事情,而不是最快的(或似乎)。
  • 如果表没有更改,您的RDBMS无论如何都可以缓存查询/结果,因此查询甚至不会触及磁盘(在任何一种情况下)。
  • 最好将两个单独的值缓存(例如memcached)以将其减少为零查询,而不是在memcached中缓存整个表。
  • 即使一个查询由于数据库的往返时间更快,Rails实例化额外记录的时间(只是让你把大部分记录丢掉)可能会弥补两个时间查询。也就是说,有两个查询,Rails将不得不准备它们,这也需要时间。

如果您真的想知道真正的答案,唯一可以确定的方法就是对它进行基准测试。创建一个执行基准测试的Rake任务,然后在Heroku上运行它。

答案 1 :(得分:0)

你查了一下日志吗?你确定Rails在第二种情况下也不会做2个查询吗?