🐘

【Rails】カラムが最大値のレコードを取得する

2024/04/13に公開

インデックス指定か .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