オプティマイザーとは
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インデックスを使ったアクセス
refはconstではないインデックスを使って等価価値検索(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