sizeとcountの違い
activerecordで取得したレコードの数を調べるときにcountとsizeを使ったら速度にかなりの差が出たのでその違いを調べました。
countとsizeの差はそのレコードがロードされているか否かで変わります。
レコードがロードされている時、countはsqlを生成し、sizeはsqlを生成しません。つまり、sizeの方が高速です。
a = Article.first.tags a.count (0.4ms) SELECT COUNT(*) FROM `tags` INNER JOIN `articles_tags` ON `tags`.`id` = `articles_tags`.`tag_id` WHERE `articles_tags`.`article_id` = 1 => 1 a.size => 1
レコードがロードされていない時はどちらもcountのsqlを生成します。
Article.first.tags.count Article Load (0.3ms) SELECT `articles`.* FROM `articles` ORDER BY `articles`.`id` ASC LIMIT 1 (0.5ms) SELECT COUNT(*) FROM `tags` INNER JOIN `articles_tags` ON `tags`.`id` = `articles_tags`.`tag_id` WHERE `articles_tags`.`article_id` = 1 => 1 Article.first.tags.size Article Load (0.3ms) SELECT `articles`.* FROM `articles` ORDER BY `articles`.`id` ASC LIMIT 1 (0.3ms) SELECT COUNT(*) FROM `tags` INNER JOIN `articles_tags` ON `tags`.`id` = `articles_tags`.`tag_id` WHERE `articles_tags`.`article_id` = 1 => 1
条件を付けたい時はcountを使い、他はだいたいsizeで事足りるようです。
参考
http://apidock.com/rails/ActiveRecord/Associations/AssociationCollection/size