Quantcast
Channel: Planet MySQL
Viewing all articles
Browse latest Browse all 1081

「SQL実践入門」勝手に補足: MySQLで実行計画を見る

$
0
0
現在以下の読書会を行っています。

「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

Viewing all articles
Browse latest Browse all 1081

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>