两个看似相同的查询(只要像我这样的新手就能看出来,但首先是更快的整体的局部模板渲染时间(没什么改变,但IDS语句)。此外,通过轨控制台进行测试时,后者将。明显地运行一个查询,前者会不是我不明白,为什么 - 为什么第一条语句是几毫秒比第二快 - 虽然我想这是由于较短的方法链接来获得相同的结果。两个(看似)相同的查询,其中一个更快,为什么?
更新:我的不好,他们没有运行相同的查询,但仍然很有趣,所有列上的select都比一列上的select更快,可能与链接方法相比,可以忽略不计。
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)的顺序外键引用的人。 注意:我使用SQL的Squeel。
什么是'select {person_id}'的意思? – 2012-04-14 08:00:49
我不知道答案是肯定的,这就是为什么我只是留下评论,但我的猜测是,arel只是更快地编译第一个。您可以使用像'IDS = current_user.activities.reverse_order.pluck得到它更快(:为person_id)'' – x1a4 2012-04-14 08:01:36
选择{为person_id}'只是提炼的结果,用'person_id'忽略所有其他列。 – Jonathan 2012-04-14 08:06:38