現在以下の読書会を行っています。
「SQL実践入門」読書会
そろそろ実行計画を読むところに差し掛かるのですが、本書は具体例としては
OracleとPostgreSQLの実行計画しか利用していません。そこで、本エントリでは
MySQLでの実行計画の表示の仕方と簡単な意味(を確認するリンク)を補足します。
まず、「SQL実践入門」のサポートページから、データをダウンロードします。
サポートページ
解凍するとcodeディレクトリ以下にcode*.txtが展開されますので、まずCode1.txtを参照します。
■「図1.8::店舗テーブルのサンプル」を作成、のcreate tableはそのまま実行できます。
テーブルスキャンとインデックススキャンは、それぞれ頭にEXPLAINをつけて実行します。
上記はMySQL 5.7で実行した結果ですが、filtered以外は、おくのさんの以下のエントリを見ると意味がわかります。
MySQLのEXPLAINを徹底解説!!(漢のコンピュータ道)
■「図1.14::予約管理テーブルのサンプル」を作成
も、MySQLで問題なく実行できます。
mysql> explain SELECT shop_name
-> FROM Shops S INNER JOIN Reservations R
-> ON S.shop_id = R.shop_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| 1 | SIMPLE | R | NULL | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using where |
| 1 | SIMPLE | S | NULL | eq_ref | PRIMARY | PRIMARY | 15 | test.R.shop_id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)
統計情報は
ANALYZE Shops;
ANALYZE Reservations;
ではなく
ANALYZE table Shops;
ANALYZE table Reservations;
で実行します。私の場合testスキーマ(データベース)に作成しているので、以下のようになります。
mysql> ANALYZE table Shops;
+------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------+---------+----------+----------+
| test.shops | analyze | status | OK |
+------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> ANALYZE table Reservations;
+-------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------------+---------+----------+----------+
| test.reservations | analyze | status | OK |
+-------------------+---------+----------+----------+
1 row in set (0.01 sec)
とりあえずこれで第1章は大丈夫かな。
もっと細かくオプティマイザの動作を見るには、以下のおくのさんのエントリを参照してみてください。
オプティマイザトレースによるちょっとディープな快適チューニング生活(漢のコンピュータ道)
GUIで確認したい場合はVisual Explainを使うといいでしょう。
MySQLでVisual Explain(漢のコンピュータ道)
では、隔週水曜日ねこじゃらし様の会場でお会いしましょう!
PlanetMySQL Voting: Vote UP / Vote DOWN
「SQL実践入門」読書会
そろそろ実行計画を読むところに差し掛かるのですが、本書は具体例としては
OracleとPostgreSQLの実行計画しか利用していません。そこで、本エントリでは
MySQLでの実行計画の表示の仕方と簡単な意味(を確認するリンク)を補足します。
まず、「SQL実践入門」のサポートページから、データをダウンロードします。
サポートページ
解凍するとcodeディレクトリ以下にcode*.txtが展開されますので、まずCode1.txtを参照します。
■「図1.8::店舗テーブルのサンプル」を作成、のcreate tableはそのまま実行できます。
テーブルスキャンとインデックススキャンは、それぞれ頭にEXPLAINをつけて実行します。
mysql> explain SELECT * FROM Shops;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | Shops | NULL | ALL | NULL | NULL | NULL | NULL | 60 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
mysql> explain SELECT *
-> FROM Shops
-> WHERE shop_id = '00050';
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | Shops | NULL | const | PRIMARY | PRIMARY | 15 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
上記はMySQL 5.7で実行した結果ですが、filtered以外は、おくのさんの以下のエントリを見ると意味がわかります。
MySQLのEXPLAINを徹底解説!!(漢のコンピュータ道)
■「図1.14::予約管理テーブルのサンプル」を作成
も、MySQLで問題なく実行できます。
mysql> explain SELECT shop_name
-> FROM Shops S INNER JOIN Reservations R
-> ON S.shop_id = R.shop_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| 1 | SIMPLE | R | NULL | ALL | NULL | NULL | NULL | NULL | 10 | 100.00 | Using where |
| 1 | SIMPLE | S | NULL | eq_ref | PRIMARY | PRIMARY | 15 | test.R.shop_id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)
統計情報は
ANALYZE Shops;
ANALYZE Reservations;
ではなく
ANALYZE table Shops;
ANALYZE table Reservations;
で実行します。私の場合testスキーマ(データベース)に作成しているので、以下のようになります。
mysql> ANALYZE table Shops;
+------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+------------+---------+----------+----------+
| test.shops | analyze | status | OK |
+------------+---------+----------+----------+
1 row in set (0.02 sec)
mysql> ANALYZE table Reservations;
+-------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------------+---------+----------+----------+
| test.reservations | analyze | status | OK |
+-------------------+---------+----------+----------+
1 row in set (0.01 sec)
とりあえずこれで第1章は大丈夫かな。
もっと細かくオプティマイザの動作を見るには、以下のおくのさんのエントリを参照してみてください。
オプティマイザトレースによるちょっとディープな快適チューニング生活(漢のコンピュータ道)
GUIで確認したい場合はVisual Explainを使うといいでしょう。
MySQLでVisual Explain(漢のコンピュータ道)
では、隔週水曜日ねこじゃらし様の会場でお会いしましょう!
JUGEMテーマ:コンピュータ
PlanetMySQL Voting: Vote UP / Vote DOWN