MySQLのEXPLAINキーワードはクエリを実行する?それとも実行計画を説明するだけ?仕組みを解説
MySQLのEXPLAINキーワードとは?
MySQLのEXPLAINキーワードは、クエリを実際に実行するものではありません。EXPLAINは「そのクエリがどのように実行されるか」、つまりMySQLオプティマイザが選択した実行計画(Execution Plan)を表示するためのコマンドです。
具体的には、どのテーブルがどの順番で読み込まれるか、どのインデックスが使用されるか(または使用されないか)、スキャンされる推定行数など、パフォーマンスチューニングに役立つ情報を確認できます。SELECT文だけでなく、INSERT、UPDATE、DELETE文の分析にも利用可能です。
それでは、実際にサンプルを使ってEXPLAINの動作を確認してみましょう。
1. サンプルテーブルの作成
まず、FirstNameカラムにインデックスを設定したテーブルを作成します。
mysql> create table DemoTable1375
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> FirstName varchar(20),
-> INDEX FIRST_INDEX(FirstName)
-> );
Query OK, 0 rows affected (0.73 sec)
2. レコードの挿入
INSERTコマンドで複数のレコードを追加します。
mysql> insert into DemoTable1375(FirstName) values('Chris');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable1375(FirstName) values('Bob');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1375(FirstName) values('Sam');
Query OK, 1 row affected (1.06 sec)
mysql> insert into DemoTable1375(FirstName) values('David');
Query OK, 1 row affected (0.09 sec)3. SELECT文でレコードを表示
通常のSELECT文で全レコードを取得してみます。
mysql> select * from DemoTable1375;
実行結果:
+----+-----------+
| Id | FirstName |
+----+-----------+
| 2 | Bob |
| 1 | Chris |
| 4 | David |
| 3 | Sam |
+----+-----------+
4 rows in set (0.00 sec)
4. EXPLAINを使用したクエリ
次に、同じSELECT文の先頭にEXPLAINを付けて実行します。
mysql> explain select * from DemoTable1375;
実行結果:
+----+-------------+---------------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
| 1 | SIMPLE | DemoTable1375 | NULL | index | NULL | FIRST_INDEX | 63 | NULL | 4 | 100.00 | Using index |
+----+-------------+---------------+------------+-------+---------------+-------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.03 sec)
EXPLAINの出力結果の見方
- select_type:クエリの種類(SIMPLEはサブクエリやUNIONを含まない単純なSELECTを意味します)
- type:アクセス方式。indexはインデックス全体をスキャンすることを示します
- key:実際に使用されたインデックス。この例ではFIRST_INDEXが使われています
- rows:スキャンが必要と推定される行数
- Extra:追加情報。「Using index」はインデックスのみで処理が完結するカバリングインデックスが利用されていることを示します
まとめ
EXPLAINキーワードはクエリを実行せず、実行計画だけを説明(表示)するコマンドです。クエリの先頭に付けるだけで、オプティマイザが選択したアクセス方式やインデックスの利用状況を確認できます。SQLのパフォーマンス改善やインデックス設計を見直す際の必須ツールと言えるでしょう。
-
MySQLで最大の累積値とその出現回数を取得するクエリの書き方
カラム同士を掛け合わせた値(累積値)の中から最大値と、その出現回数を取得したい場合は、集計関数 COUNT(*) をサブクエリと組み合わせて使用します。あわせて GROUP BY 句も活用します。テーブルの作成まず、以下のコマンドでテーブルを作成しましょう。mysql> create table demo23-> (-> id int not null auto_increment primary key,-> value1 int,-> value2 int-> );Query OK, 0 rows affected (1.65 sec)レコードの挿入続い
-
MySQLの構文エラーとは?予約済みキーワードでテーブルを作成する方法
MySQLの予約済みキーワードによる構文エラーとはMySQLでは、テーブル名に予約済みキーワード(reserved keyword)を使用すると、そのままではSQL構文エラーが発生します。ここでは例として、「groups」という名前のテーブルを作成しようとした場合を見てみましょう。「groups」はMySQLの予約済みキーワードであるため、通常の記述方法ではテーブルを作成できません。エラーが発生するケース以下のように、予約語「groups」を使ってテーブルを作成しようとすると、ERROR 1064という構文エラーが出力されます。mysql> create table groups->