🐘
【Rails】カラムが最大値のレコードを取得する
.first
かでパフォーマンスに差が出る
インデックス指定か 例えば created_at が一番新しいレコードを取得するとき、
「order
メソッドで降順に並び替えてから一番最初のレコードを取得する」
という方法があります。
そのとき、以下の2つの方法があります。
- 配列のように0番目のインデックスを指定して取得する
- first メソッドで取得する
このとき、発行される SQL には以下のような差があります
rails console
> Article.order(created_at: :desc)[0]
SELECT `articles`.* FROM `articles` ORDER BY `articles`.`created_at` DESC
> Article.order(created_at: :desc).first
SELECT `articles`.* FROM `articles` ORDER BY `articles`.`created_at` DESC LIMIT 1
見て分かる通り、最初の0番目のインデックスを指定する方法だと、
全件取得する SQL が発行されていることが確認できます。
つまり、
①SQL でレコードを全件取得
②Ruby の文法([0]
)で、①の全件の中から0番目の要素を取得
という処理になります。
一方 .first
を使う場合だと、 SQL で1番目のレコードのみ取得するクエリが発行されている(LIMIT 1
)ため、全件取得するということはしなくて良くなっています。
このことから、最大値のレコードを取得するときは、インデックス指定ではなく first を使用したほうがパフォーマンス面で優れていることがわかります。
まとめ
あるカラムが最大のレコードを取得するときは ActiveRecord の first
メソッドを使用しましょう!
Discussion