蚊帳の中の日記

ゆるく生きてます

そいつはどんなQuery吐くんや?

RailsActiveRecordとか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して、ちゃんとどんなクエリが発行されているのか?余計なクエリは発行していないか?を確認・意識することが重要。