はじめに
MySQLに発行したクエリの実行計画をWorkbenchで確認してみました。
検証に使用した環境
DB:MySQL8.0
Visual Explain Plan
MySQL Workbenchの機能で、実行したクエリの実行計画を視覚的に確認することができます。
前準備
検証データを作成
クエリを発行するためにテストデータを用意します。
MySQL Workbenchの公式ドキュメントで使われているselect文をなるべく使いたいので、
合わせてテーブルとデータを作成します。
-- 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 = ''」に変更してあります。
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;
実行計画を視覚的に確認
Visual Explain Planで実行計画を確認します。
Workbenchの実効結果(Result Grid)の右側の黒い箇所から「Execution Plan」を選択します。!
Visual Explain 図が表示されました。
テーブルの処理順や読み取り方法などが読み取れるようになってます。
図の色などの意味は公式ドキュメントにも記載されています。
ちなみにテーブルの枠をマウスオーバーすると詳細もみれます。
(吹き出しが小さくて見づらいですが・・・)
EXPLAINの形式で確認する
通常のEXPLAINステートメントを実行した時の形式でも確認できます。
実行計画が表示されている欄の左上から「Tabular Explain」を選択します。
テーブルごとにidやselect_typeが表示されました。
参考文献