はじめに
「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:クエリの処理ステップのID。複数の処理ステップがある場合に、順番を識別します
Select_type:クエリの種類(SIMPLE, PRIMARY, SUBQUERYなど)
Table:クエリがアクセスするテーブル名
Type:テーブルへのアクセス方法(ALL, INDEX, RANGEなど)
Possible_keys:使用可能なインデックス
Key:実際に使用されるインデックス
Rows:スキャンされる行数の推定
Extra:その他の情報(例えば、Using whereやUsing indexなど)
まとめ
・SQLクエリのパフォーマンスを最適化するためには、実行計画を確認することが大切
・EXPLAINを使用することで、SQLがどのように実行されるかを把握し、インデックスの利用状況やテーブルスキャンの方法を確認できる
・クエリの最適化を行うことで、アプリケーションのパフォーマンスを大きく改善することができる
その2は具体的に実行計画を利用した、SQLパフォーマンスの改善方法
について書こうと思います
結局、SQLの実行計画って何が嬉しいのって話 その2 ~クエリの最適化とパフォーマンス改善~