SQL性能(EXPLAIN・slow query)とは?遅い問い合わせを速くする工夫

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

SQL性能とは(全体像)

SQL性能チューニングは、時間のかかる問い合わせ(クエリ)を、速く動くように直す作業

身近にたとえると、料理の手順を見直す感じ。「どの順で・どの道具を使って作っているか」を確認して、ムダな手間を減らすと速くなるよー。

押さえるのは、EXPLAINで実行計画を見ること、そしてインデックスは多ければよいわけではないことだよー。遅い問い合わせはSlow Query Logで見つけられるのー。


詳しく:EXPLAINとインデックスの使い方だけ覚えれば戦える

ここが記事の心臓部。まず速くする基本を見ていこーね。

SQLを速くする基本

工夫内容
EXPLAIN問い合わせの「実行計画」(どう動くか)を確認する
インデックスWHEREやJOIN、並べ替えに適切に使う
**SELECT * 回避**必要な列だけ取る(全部取らない)
Slow Query Log遅い問い合わせを記録して見つける

ここで一番のひっかけが「インデックスは多ければ多いほど速い」という誤解。インデックスを増やすと、データを更新するたびに索引も直すので更新が重くなる。だから必要なところに適切に置くのー。多い=速い、ではないよー。

もう1つのひっかけが「**SELECT \* (全部取る)が安全で速い」という思い込み。必要な列だけを取るほうが速い**。使わない列まで運ぶのはムダだよー。

そして、まず直すべき遅い問い合わせは、Slow Query Log(時間のかかった問い合わせの記録)で見つけられるのー。

わかりやすく言い換えると

要するに、料理の手順見直しでイメージするとラクだよー。

EXPLAIN … 「どの順で・どの道具で作るか」の手順書(実行計画)を見る

インデックス … よく使う道具を手元に置く。でも置きすぎると片づけ(更新)が大変

③**SELECT * 回避** … 使う材料だけ出す(全部出すとムダ)

つまり、「EXPLAINで実行計画を見る」「インデックスは適切に(多い=速いではない)」、この2点が試験の急所なのー。


試験のツボ

🔴 一番出る:EXPLAIN

①EXPLAINは問い合わせの「実行計画」(どう動くか)を確認する道具

②インデックスが使われているか、JOINの順などが分かる

🔴 次に出る:インデックスの使い方

①WHEREやJOIN、並べ替えに適切に使うと速くなる

②増やしすぎると更新が重くなる(多い=速いではない)

🟡 **押さえると安定:SELECT*回避とSlow Query Log**

①SELECT * を避けて必要な列だけ取るほうが速い

②遅い問い合わせはSlow Query Logで見つける


よくある間違い

「インデックスは多ければ多いほど速い」→ ✗  増やすと更新が重くなる。必要なところに適切に置くのが正しい。

②**「SELECT *(全部取る)が安全で速い」→ ✗**  必要な列だけ取るほうが速い。使わない列まで運ぶのはムダ。

「EXPLAINはデータを削除する命令である」→ ✗  EXPLAINは問い合わせの実行計画を確認する道具。削除はしない。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(EXPLAIN)

📝 オリジナル問題 1 EXPLAIN

EXPLAINに関する次の記述のうち、正しいものはどれか。

  1. EXPLAINはデータを必ず削除するための命令のことだとされているものである
  2. EXPLAINは画面を必ず明るくするための設定のことだとされているものである
  3. EXPLAINはデータを必ず暗号化するための命令のことだとされているものである
  4. EXPLAINは問い合わせの実行計画(どう動くか)を確認するための道具である
データスラ
データスラ 解答・解説

解答は 4 だよー。

EXPLAINは、問い合わせの「実行計画」(どう動くか)を確認するための道具なのー。インデックスが使われているか、JOINの順などが分かるよー。

選択肢1の「削除する命令」、選択肢2の「明るくする設定」、選択肢3の「暗号化」はどれも誤りなのー。

選択肢判定理由
1削除する命令ではない
2明るくする設定ではない
3暗号化の命令ではない
4実行計画を確認する道具

オリジナル問題2(インデックスの使い方)

📝 オリジナル問題 2 インデックスの使い方

インデックスとSQL性能に関する次の記述のうち、正しいものはどれか。

  1. インデックスは多ければ多いほど必ず速くなり、いくつ作っても問題ないものだとされている
  2. インデックスは増やすと更新が重くなるので、必要なところに適切に置くのが基本である
  3. インデックスは作るとデータが必ず消えてしまうものだとされているものである
  4. インデックスは画面の色を決めるための設定のことだとされているものである
データスラ
データスラ 解答・解説

解答は 2 だよー。

インデックスは、増やすとデータを更新するたびに索引も直すので更新が重くなるのー。だから必要なところに適切に置くのが基本だよー。多い=速い、ではないんだよー。

選択肢1の「多いほど速い」、選択肢3の「データが消える」、選択肢4の「色を決める設定」はどれも誤りなのー。

選択肢判定理由
1多すぎると更新が重くなる
2必要なところに適切に置く
3データは消えない
4色を決める設定ではない

オリジナル問題3(SELECT*回避)

📝 オリジナル問題 3 SELECT*回避

SELECT * とSQL性能に関する次の記述のうち、正しいものはどれか。

  1. SELECT * は必要な列だけ取るより速いので、いつも使うのがよいものだとされている
  2. SELECT * を使うとデータが必ず暗号化されるものだとされているものである
  3. SELECT * (全部取る)より、必要な列だけを取るほうが速くなる場合が多いのである
  4. SELECT * は画面を必ず点滅させるための設定のことだとされているものである
データスラ
データスラ 解答・解説

解答は 3 だよー。

**SELECT \* (全部取る)より、必要な列だけを取るほうが速い**ことが多いのー。使わない列まで運ぶのはムダだから、必要な列だけにしぼるといいよー。

選択肢1の「全部取るほうが速い」、選択肢2の「暗号化される」、選択肢4の「点滅させる」はどれも誤りなのー。

選択肢判定理由
1必要な列だけのほうが速い
2暗号化されない
3必要な列だけにしぼると速い
4点滅させる設定ではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る