ActiveRecords select(:id).collect与pluck(:id)方法:为什么纯AR“采摘”更慢?
我试图从我的文章模型中获取所有ID。 我可以用两种方式做到:
Article.select(:id).collect{|a| a.id} Article Load (2.6ms) SELECT "articles"."id" FROM "articles"
要么
2.2.1 :006 > Article.pluck(:id) (4.3ms) SELECT "articles"."id" FROM "articles"
是什么赋予了? 为什么AR比Ruby版本慢?
即使我对Ruby方法进行基准测试,它似乎更快:
Benchmark.measure{Article.select(:id).collect{|a| a.id}} Article Load (1.9ms) SELECT "articles"."id" FROM "articles" => #
您的基准测试不准确。 首先,正如您所看到的,数据库端的两个执行都会触发相同的查询
SELECT "articles"."id" FROM "articles"
因此,数据库时间应该被视为无关紧要。 显然,这两个查询具有不同的执行时间,如控制台所示,但这是正常的,就好像您运行相同的查询100次执行时间每次都可能不同,因为它取决于各种变量,如机器负载,数据库状态等
由于数据库执行时间可以被认为是等效的,因此它与基准测试无关。
因此,您需要比较的是Ruby执行时间和分配。 与collect
它不分配ActiveRecord对象相比,Pluck应该更快,更轻量,而只返回选定的值。
如果你真的想要对这些方法进行基准测试,你应该模拟数据库时间(这显然是可变的,但与此基准测试无关),只有基准分配和两种不同的Ruby方法。
长话短说, pluck
通常更有效率。
select
用于获取具有特定属性的记录。 它返回一个ActiveRecord::Relation
对象。
pluck
可以与select
使用相同的方式使用,但是它返回一个选定属性的数组。
你可以阅读这篇文章 。