两个(看似)相同的查询,一个更快,为什么?

时间:2012-04-14 07:55:45

标签: ruby ruby-on-rails-3 benchmarking

两个看似相同的查询(就像我这样的新手可以判断,但第一个在部分模板渲染时间总体上更快(除了ids语句之外没有其他任何改变)。另外,当通过rails控制台进行测试时,后者会明显地运行查询,前者不会。我不明白为什么 - 以及为什么第一个语句比第二个语句快几个 ms - 虽然我可以猜测它是由于更短的方法链接得到相同的结果。

更新:我的坏。它们没有运行相同的查询,但仍然很有趣的是所有列上的选择比一列上的选择更快。与链接方法相比,它可能是微不足道的差异。

ids = current_user.activities.map(&:person_id).reverse
SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (7.4ms)


ids = current_user.activities.order('id DESC').select{person_id}.map(&:person_id)
SELECT "activities"."person_id" FROM "activities" WHERE "activities"."user_id" = 1 ORDER BY id DESC    
SELECT "people".* FROM "people" WHERE "people"."id" IN (1, 4, 12, 15, 3, 14, 17, 10, 5, 6) Rendered activities/_activities.html.haml (10.3ms)

该语句的目的是按照它们出现在活动表中的顺序(在其PK上)检索对人的外键引用。 注意:我使用Squeel作为SQL。

1 个答案:

答案 0 :(得分:1)

在第一个查询中,你已经链接了.map和.reverse,而在第二个查询中,你使用了.order('id DESC')。select(person_id)这是不必要的,如果你添加.reverse