【MySQL学習】実行計画をVisual Explain Planで確認する

# はじめに
MySQLに発行したクエリの実行計画をWorkbenchで確認してみました。

# 検証に使用した環境
DB：MySQL8.0

# Visual Explain Plan
MySQL Workbenchの機能で、実行したクエリの実行計画を視覚的に確認することができます。

# 前準備
## 検証データを作成
クエリを発行するためにテストデータを用意します。
MySQL Workbenchの[公式ドキュメント](https://dev.mysql.com/doc/workbench/en/wb-performance-explain.html)で使われているselect文をなるべく使いたいので、
合わせてテーブルとデータを作成します。

```shell
-- rentalテーブル
create table rental (
customer_id VARCHAR(10) not null PRIMARY KEY default ''
, inventory_id VARCHAR(10) not null default ''
, return_date VARCHAR(10) not null default ''
, rental_date VARCHAR(10) not null default ''
) ;
INSERT INTO `mysql`.`rental` (`customer_id`, `inventory_id`, `return_date`, `rental_date`) VALUES ('1', '1', '', '20220728');

-- customerテーブル
create table customer (
customer_id VARCHAR(10) not null PRIMARY KEY default ''
, first_name VARCHAR(10) not null default ''
, last_name VARCHAR(10) not null default ''
, address_id VARCHAR(10) not null default ''
) ;
INSERT INTO `mysql`.`customer` (`customer_id`, `first_name`, `last_name`, `address_id`) VALUES ('1', 'hoge', 'hoge', '1');

-- addressテーブル
create table address (
address_id VARCHAR(10) not null PRIMARY KEY default ''
, phone VARCHAR(10) not null default ''
) ;
INSERT INTO `mysql`.`address` (`address_id`, `phone`) VALUES ('1', 'xxx-xxxx');

-- inventoryテーブル
create table inventory (
inventory_id VARCHAR(10) not null PRIMARY KEY default ''
, film_id VARCHAR(10) not null default ''
) ;
INSERT INTO `mysql`.`inventory` (`inventory_id`, `film_id`) VALUES ('1', '1');

-- filmテーブル
create table film (
film_id VARCHAR(10) not null PRIMARY KEY default ''
, rental_duration VARCHAR(10) not null default ''
, title VARCHAR(10) not null default ''
) ;
INSERT INTO `mysql`.`film` (`film_id`, `rental_duration`, `title`) VALUES ('1', '7', 'hoge');
```

# 使ってみる
## クエリを実行する
公式に記載されていたクエリを実行してみます。
※各カラムにnot null制約を入れたため、「WHERE rental.return_date IS NULL」は「WHERE rental.return_date = ''」に変更してあります。

```shell
SELECT CONCAT(customer.last_name, ', ', customer.first_name) 
  AS customer, address.phone, film.title FROM rental
INNER JOIN customer ON rental.customer_id = customer.customer_id
INNER JOIN address ON customer.address_id = address.address_id
INNER JOIN inventory ON rental.inventory_id = inventory.inventory_id
INNER JOIN film ON inventory.film_id = film.film_id
WHERE rental.return_date = ''
AND rental_date + INTERVAL film.rental_duration DAY < CURRENT_DATE()
LIMIT 5;
```

実行結果
![クエリ実行後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569086/5eb242a1-2b14-884f-e2d5-10a92b5bf5f1.png)

## 実行計画を視覚的に確認
Visual Explain Planで実行計画を確認します。
Workbenchの実効結果(Result Grid)の右側の黒い箇所から「Execution Plan」を選択します。!
![Execution Plan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569086/47a143c7-e36b-b98f-7757-4631069a246f.png)

Visual Explain 図が表示されました。
テーブルの処理順や読み取り方法などが読み取れるようになってます。
図の色などの意味は[公式ドキュメント](https://dev.mysql.com/doc/workbench/en/wb-performance-explain.html#wb-performance-explain-visual-conventions-info)にも記載されています。

ちなみにテーブルの枠をマウスオーバーすると詳細もみれます。
（吹き出しが小さくて見づらいですが・・・）
![フォーカスを当てると.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569086/32c57699-af56-4310-8db5-75c00942a28f.png)

### EXPLAINの形式で確認する
通常のEXPLAINステートメントを実行した時の形式でも確認できます。
実行計画が表示されている欄の左上から「Tabular Explain」を選択します。
![実行計画の表示形式を切り替える.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569086/aa7d3d55-2ee0-0d43-1bfd-b361a995c933.png)

![Tabular Explainで表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569086/15ce238a-c5ae-b278-7c50-ce57f18a3bd9.png)

テーブルごとにidやselect_typeが表示されました。

# 参考文献

https://dev.mysql.com/doc/workbench/en/wb-performance-explain.html