1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-28

はじめに

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;

実行結果
クエリ実行後.png

実行計画を視覚的に確認

Visual Explain Planで実行計画を確認します。
Workbenchの実効結果(Result Grid)の右側の黒い箇所から「Execution Plan」を選択します。!
Execution Plan.png

Visual Explain 図が表示されました。
テーブルの処理順や読み取り方法などが読み取れるようになってます。
図の色などの意味は公式ドキュメントにも記載されています。

ちなみにテーブルの枠をマウスオーバーすると詳細もみれます。
(吹き出しが小さくて見づらいですが・・・)
フォーカスを当てると.png

EXPLAINの形式で確認する

通常のEXPLAINステートメントを実行した時の形式でも確認できます。
実行計画が表示されている欄の左上から「Tabular Explain」を選択します。
実行計画の表示形式を切り替える.png

Tabular Explainで表示.png

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

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?