RailsモデルとActive Record基礎|クエリログの読み方を理解してEXPLAIN・joins・includesの違いを学ぼう
生徒
「Railsを動かすと、画面に英語や数字がたくさん流れてきて怖いです……」
先生
「それはクエリログですね。データベースとの会話内容が表示されているだけです。」
生徒
「joinsとかincludesとか書くと、ログが変わるのはなぜですか?」
先生
「その違いが分かると、Railsの動きが一気に理解しやすくなりますよ。」
1. クエリログとは?Railsとデータベースの会話記録
クエリログとは、Railsがデータベースに対して 「どんなデータをください」とお願いしたかを そのまま表示した記録のことです。 Railsでは、Active Recordを通して自動的に データベースとやり取りをしています。
初心者の方は、クエリログを 「レジでのやり取りがレシートに印字される」 ようなものだと考えてみてください。 商品名や金額が分かることで、 何を買ったかが後から確認できます。
2. クエリログの基本的な読み方
Railsのログには、SELECTやFROMといった 英単語が並びます。 これはSQLと呼ばれる、データベース専用の言葉です。 難しく見えますが、最初は雰囲気だけ分かれば十分です。
User.all
SELECT "users".* FROM "users"
このログは、「usersという表から、全部のデータを取ってきた」 という意味になります。 Railsのコードとログが対応していることを 意識するだけで理解が進みます。
3. joinsとは?表同士をつなげて取得する方法
joinsは、複数のテーブルを結合して
一度に条件検索を行うための方法です。
データベースにとって分かりやすい命令なので、
処理が速くなることが多いです。
例えるなら、2冊の名簿を机の上で 並べて照らし合わせるイメージです。
Post.joins(:user)
SELECT "posts".* FROM "posts"
INNER JOIN "users" ON "users"."id" = "posts"."user_id"
joinsは検索向きですが、 関連データを画面表示で使うときは、 N+1問題が起きやすい点に注意が必要です。
4. includesとは?表示を意識したやさしい取得方法
includesは、関連するデータを
あらかじめまとめて読み込む方法です。
主に画面表示で使われます。
買い物に行く前に、 必要な物を全部リストアップして 一度で買うような感覚です。
Post.includes(:user)
SELECT "posts".* FROM "posts"
SELECT "users".* FROM "users" WHERE "users"."id" IN (1,2,3)
クエリが2回に分かれている点が特徴です。 その代わり、画面表示時に 無駄な問い合わせが増えにくくなります。
5. EXPLAINとは?データベースの考え方をのぞく道具
EXPLAINは、
「この検索はどういう順番で処理されますか?」
とデータベースに質問する仕組みです。
Railsのコードが遅い原因を調べるときに使います。
これは、地図アプリで 「この道は渋滞しますか?」 と確認するようなものです。
Post.explain
初心者のうちは、 EXPLAINの細かい内容まで 理解できなくても問題ありません。 「重そうかどうか」を感じ取れるだけで十分です。
6. joins・includes・EXPLAINをどう使い分けるか
joinsは検索条件を絞りたいときに向いています。 includesは画面表示で関連データを使うときに便利です。 EXPLAINは、処理が遅いと感じたときの確認用です。
クエリログを見る習慣がつくと、 Railsが裏側で何をしているのかが 少しずつ見えるようになります。 それが、Active Recordを理解する 大きな一歩になります。