「なぜか検索が遅い…」そんな時に魔法をかける `EXPLAIN` の話
こんにちは!データベースエンジニアの現場で日々SQLと格闘している筆者です。
皆さんは、PostgreSQLを使っていて「さっきまでサクサク動いていたのに、急に検索が重くなった…」なんて経験、ありませんか? データベースが裏で何をしているのか分からないと、まるで真っ暗な部屋で探し物をするような気分ですよね。
そんな時、僕たちが必ず最初に使う「最強の道具」があります。それが `EXPLAIN` です。今日は、これが一体どんなものなのか、肩の力を抜いてお話ししますね。
—
「料理のレシピ」を事前にチェックするイメージ
`EXPLAIN` を一言で言うと、「データベースがクエリを実行する前の『下見』」です。
想像してみてください。あなたは今、ものすごく手の込んだフルコース料理を作ろうとしています。でも、作り始めてから「あ、メインの食材がない!」とか「オーブンが足りない!」って気づいたら大惨事ですよね。
`EXPLAIN` は、料理を始める前に、シェフ(PostgreSQLのプランナ)が「まずは野菜を切って、その間に肉を下ごしらえして、最後にオーブンに入れるよ」という手順書(実行計画)をあなたに見せてくれるようなものなんです。
実際に料理を始める(クエリを実行する)前に、「この手順で本当に大丈夫? もっと早い方法はないかな?」と確認できる。これがチューニングの第一歩です。
—
使い方は驚くほどシンプル
使い方は簡単。いつも実行しているSQLの頭に `EXPLAIN` と付けるだけです。
EXPLAIN SELECT FROM users WHERE age > 20;
これを実行すると、データが実際に検索されるわけではなく、データベースが「僕ならこうやって探すよ!」という計画を教えてくれます。
出てくる数字の見方を怖がらないで
コマンドを実行すると、何やら難しそうな文字列がずらりと並びますよね。「コスト(Cost)」とか「行数(Rows)」といった言葉が出てきて、初学者の皆さんはここで一度ブラウザを閉じたくなるかもしれません。
でも、全部を完璧に理解する必要はありません! 最初はこれだけチェックしてみてください。
- どこを一番見ているか?
(インデックスを使っているのか、それともテーブルの端から端まで全部なめているのか)
- 「Seq Scan」という文字があるか?
これが「テーブルの最初から最後まで全部見る」という意味の、いわば「総当たり戦」です。件数が多いテーブルでこれが出ていたら、検索が遅くなる原因の筆頭候補です。
—
なぜ「実行」せずに「予測」するの?
よく「実行したほうが早いのでは?」と聞かれますが、実は `EXPLAIN` の最大のメリットは「データを実際に取得しないこと」にあります。
例えば、何億件ものデータが入っているテーブルに対して、無謀な検索をかけたとします。もし実行してしまったら、データベースは数分間フリーズしてしまうかもしれません。でも、`EXPLAIN` なら一瞬で「それは何億行も調べることになるから、時間がかかりすぎるよ!」と教えてくれるんです。
いわば、「失敗する前にリスクを回避できる」というわけですね。
—
まとめ:SQLの「中身」を知ると、もっと仲良くなれる
`EXPLAIN` は、データベースという「優秀だけど気難しい相棒」の頭の中を覗くためのツールです。「なぜ遅いのか」を怒るのではなく、「なるほど、君はそんな手順で探そうとしていたんだね」と理解してあげること。
そうやってコミュニケーションを取るうちに、いつの間にか皆さんも、SQLを書くのが楽しくなってくるはずですよ。
まずは自分のプロジェクトのSQLに、こっそり `EXPLAIN` を付けてみてください。いつもと違う景色が見えてくるかもしれません。
それでは、また次回の記事でお会いしましょう!データベースライフを楽しんでくださいね。
コメント