そいつはどんなQuery吐くんや?
RailsのActiveRecordとかLaravelのEloquentとか使っていると、たまに「あれ?このメソッドはどんなクエリ吐くっけ?」ってなったり、意図していないけど該当のメソッドを使ってしまって「余計なクエリを発行してもうた〜」ってなることが個人的によくあって、レビューで指摘を受けることが多かった。今でもたまにある。
Railsだとfirstとかlastとかfindとか、ホントよく使うし、Rails Guideでもクエリインターフェースの章で序盤に出てくる基本的なもの。実際使ってみると、お手軽感があり、「あ、余計にfindしちゃった」「あ、firstじゃなくても良さそう」とかなったりする。exist?
とかもよく使うけど、クエリ発行するので要注意だったりする。
クエリを吐くってことは、その分DBにリクエスト送っている。余計なリクエストを削減するだけでも、少しだけパフォーマンス向上とかにつながるので、できるだけこういったは抑えることを意識していきたい。
あと、モデルの関連で指定するオプションでdependent :delete_all
とか:destroy
とかあるけど、どっちのほうがパフォーマンスがいいクエリを吐くのか??とか、each回してfindとかせずにwhereでUser.where(id: user_ids.pluck(:id)
とかして該当のレコードを一括で取得するようにするとか、、、。そのメソッドがどういったクエリを吐くのか?どうしたらもっとパフォーマンスの良いクエリを発行するのかを意識する必要もありそう。
対策
開発環境でbundle exec rails s
して、ちゃんとどんなクエリが発行されているのか?、余計なクエリは発行していないか?を確認・意識することが重要。