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)
EXPLAINに関する次の記述のうち、正しいものはどれか。
- EXPLAINはデータを必ず削除するための命令のことだとされているものである
- EXPLAINは画面を必ず明るくするための設定のことだとされているものである
- EXPLAINはデータを必ず暗号化するための命令のことだとされているものである
- EXPLAINは問い合わせの実行計画(どう動くか)を確認するための道具である
解答は 4 だよー。
EXPLAINは、問い合わせの「実行計画」(どう動くか)を確認するための道具なのー。インデックスが使われているか、JOINの順などが分かるよー。
選択肢1の「削除する命令」、選択肢2の「明るくする設定」、選択肢3の「暗号化」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 削除する命令ではない |
| 2 | ✗ | 明るくする設定ではない |
| 3 | ✗ | 暗号化の命令ではない |
| 4 | ✓ | 実行計画を確認する道具 |
オリジナル問題2(インデックスの使い方)
インデックスとSQL性能に関する次の記述のうち、正しいものはどれか。
- インデックスは多ければ多いほど必ず速くなり、いくつ作っても問題ないものだとされている
- インデックスは増やすと更新が重くなるので、必要なところに適切に置くのが基本である
- インデックスは作るとデータが必ず消えてしまうものだとされているものである
- インデックスは画面の色を決めるための設定のことだとされているものである
解答は 2 だよー。
インデックスは、増やすとデータを更新するたびに索引も直すので更新が重くなるのー。だから必要なところに適切に置くのが基本だよー。多い=速い、ではないんだよー。
選択肢1の「多いほど速い」、選択肢3の「データが消える」、選択肢4の「色を決める設定」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 多すぎると更新が重くなる |
| 2 | ✓ | 必要なところに適切に置く |
| 3 | ✗ | データは消えない |
| 4 | ✗ | 色を決める設定ではない |
オリジナル問題3(SELECT*回避)
SELECT * とSQL性能に関する次の記述のうち、正しいものはどれか。
- SELECT * は必要な列だけ取るより速いので、いつも使うのがよいものだとされている
- SELECT * を使うとデータが必ず暗号化されるものだとされているものである
- SELECT * (全部取る)より、必要な列だけを取るほうが速くなる場合が多いのである
- SELECT * は画面を必ず点滅させるための設定のことだとされているものである
解答は 3 だよー。
**SELECT \* (全部取る)より、必要な列だけを取るほうが速い**ことが多いのー。使わない列まで運ぶのはムダだから、必要な列だけにしぼるといいよー。
選択肢1の「全部取るほうが速い」、選択肢2の「暗号化される」、選択肢4の「点滅させる」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 必要な列だけのほうが速い |
| 2 | ✗ | 暗号化されない |
| 3 | ✓ | 必要な列だけにしぼると速い |
| 4 | ✗ | 点滅させる設定ではない |
まとめ
押さえどころ
- 🔴 EXPLAIN = 問い合わせの実行計画(どう動くか)を確認する道具。インデックス利用やJOIN順が分かる。
- 🔴 インデックスの使い方 = 適切に使うと速い。増やしすぎると更新が重くなる(多い=速いではない)。
- 🟡 **SELECT*回避とSlow Query Log** = 必要な列だけ取るほうが速い。遅い問い合わせはSlow Query Logで見つける。
次に学ぶ
執筆: SikakuQuest編集部