はじめに
「SQLのパフォーマンスがよくないので実行計画を確認してください。」とは言われても……
何を確認してどうSQLをチューニングすればいいの?実行計画の何が嬉しいんだ?
そもそも実行計画ってなに?って感じなので、
本記事では、実行計画とは何か、EXPLAINを使った実行計画の見方、SQLの最適化方法についてまとめます。
そもそも実行計画ってなに?
実行計画とは、SQLクエリを実行するための「手順書」のようなものです。具体的には、データベースがどのような手法でクエリを実行し、どのリソースをどの順番で利用するかを示した計画です。言い換えれば、実行計画はデータベースが「どのようにしたら最も効率的にクエリを実行できるか」を計算して導き出した方法をまとめたものと言えます。
つまり、データベースが判断したパフォーマンスの高いSQLを具体的に確認することができて、どうしたらより短い時間でSQLを実行できるか、具体的な方法をまとめたもの?
実行計画を確認する目的
実行計画を確認する目的は、クエリが意図した通りに実行されているか、
またはどの部分でパフォーマンスの低下が生じているかを確認すること。
具体的には、以下のような情報を得ることができる。
テーブルのスキャン方法
テーブルを「フルスキャン」しているのか、それともインデックスを利用して効率よくデータを検索しているのか。
命令のコスト
命令の開始コスト(スキャン対象の行数に関わらずかかるコスト)や、命令の終了コスト(スキャン対象行数が増えると増えるコスト)。
推定行数
実行計画に基づいてデータベースが予測するスキャン対象となる行数。
EXPLAINってどうつかうのよ
普段使用するSQLの先頭にEXPALINをつけるだけでいいらしい
実行するとどのようにインデックスが利用され、どのテーブルがスキャンされるのかがわかる
// SQL
EXPLAIN SELECT * FROM users WHERE age > 10;
// 実行結果
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | users | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
EXPLAINの出力内容
項目名 | 意味 |
---|---|
id |
クエリ内での実行ステップの識別子(サブクエリなどで分かれる) |
select_type |
クエリの種類(SIMPLE, PRIMARY, SUBQUERY など) |
table |
対象のテーブル名 |
type |
結合タイプ(アクセス方法)。パフォーマンスに重要な指標 |
possible_keys |
使用可能なインデックス候補 |
key |
実際に使われたインデックス |
key_len |
インデックスの長さ(バイト) |
rows |
検索対象となった行数の見積もり |
Extra |
その他の実行上の情報(Using index, Using where など) |
type(データへのアクセス方法)による性能の目安
type |
説明 | 性能目安 |
---|---|---|
const / eq_ref
|
インデックス1件一致(理想) | ◎ 非常に高速 |
ref |
インデックスで部分一致 | ○ 高速 |
range |
範囲検索(BETWEEN, >, <) | ○ 良い |
index |
全インデックススキャン | △ 遅め |
ALL |
フルテーブルスキャン | ❌ 非効率 |
まとめ
・SQLクエリのパフォーマンスを最適化するためには、実行計画を確認することが大切
・EXPLAINを使用することで、SQLがどのように実行されるかを把握し、インデックスの利用状況やテーブルスキャンの方法を確認できる
・クエリの最適化を行うことで、アプリケーションのパフォーマンスを大きく改善することができる
その2は具体的に実行計画を利用した、SQLパフォーマンスの改善方法
について書こうと思います
結局、SQLの実行計画って何が嬉しいのって話 その2 ~クエリの最適化とパフォーマンス改善~