LoginSignup
0

More than 1 year has passed since last update.

posted at

データベースのオプティマイザーとEXPLAIN

オプティマイザーとは

SQLを元にデータの取得処理を生成する機能です。
SQLを受け取った時どう実行すれば処理を返せるのか(実行計画)を行います。

EXPLAINとは

DBの実行計画を確認するコマンドでクエリがどのように実行されるかを確認できます

データベースの処理の流れ

DBの処理の流れから説明します。
ざっくりですがご了承ください。

SQL文 ⏩  パーサー(ここからデータベース) ⏩  オプティマイザ(***実行計画***)⏩ 処理 

ざっくりですがこんな流れです。

⚫︎補足
パーサーSQLが正しいのかチェックしているみたいです。

実行計画の確認方法

クエリの先頭EXPLAIN をつけて実行します。
会社テーブルの社員のデータ取得を想定します。

EXPLAIN SELECT * FROM staffs WHERE id = 1

これを実行すると中身が見えます。

+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | staffs | NULL       | ref |   PRIMARY  | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

select_type クエリの種類 SIMPLEは単一のテーブル
type constはプライマリキーかuniqueインデックスを使ったアクセス
refconstではないインデックスを使って等価価値検索(where k=v)を行った時に使用

explainの読み方は下の資料で詳しく載っています。もしくは参考資料を確認してください。

⚫︎読み方の資料
http://nippondanji.blogspot.com/2009/03/mysqlexplain.html

SQL(クエリ)が遅い時どうするか

せお丸さんの回答になってしまうのですが、以下の2つをあげています。

1.インデックスをはる
2.ダメなら実行計画を確認

⚫︎参考資料  オプティマイザー
https://qiita.com/towtow/items/db397d39416adf9770aa

⚫︎参考資料  EXPLAIN
https://qiita.com/tsurumiii/items/0b70f1a1ee0499be2002

⚫︎参考動画
https://m.youtube.com/watch?v=_xjoj1-DfkE&list=PL-1KBX2gDRujQaRgEByueezHBiqHP8KDD&index=12

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
What you can do with signing up
0