SQLの実行計画
MySQL WorkbenchやpgAdminを使うとグラフィカルに実行計画が見える
EXPLAINで確認できる情報
SQLの実行計画に関する情報を取得するためのステートメント
どういうときにつかう?
「インデックスはちゃんと使われているだろうか」「インデックスでどこまでクエリーを効率的に処理できているだろうか」という疑問が湧いた時に
実行計画
「どのインデックスを使って(あるいはインデックスを使わずにテーブルスキャンで)クエリーを処理するか」をMySQLが判断した結果
SQL実行計画の疑問解決には「とりあえずEXPLAIN」しよう | Think IT(シンクイット) (2016年5月10日) yoku0825
確認すること
key(実際に使ったインデックスのkey)は本当に最適なインデックスか?
実行してみる
バッファプールに速度が影響されるので、複数回実行する
rows:「実行計画上」検査される行数
Extraは正しいか?
Extraの種類 MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.8.2 EXPLAIN 出力フォーマット
Using Indexだとインデックスだけからの読み取りでいけるので高速
Using filesortだとヤバい
Using temporary 一時テーブル使う
MySQLのUsing Temporaryについて - aeroastroの日記
O'Reilly Japan - 実践ハイパフォーマンスMySQL 第3版 2013年
これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(クエリ編) | 株式会社インフィニットループ技術ブログ 2012年
https://downloads.mysql.com/presentations/20150623_02_MySQL_Tuning_for_Beginners.pdf 2015年
ソーシャルゲーム開発者なら知っておきたい MySQL INDEX + EXPLAIN入門 | 株式会社インフィニットループ技術ブログ
見るべき部分はtype、key、rows、Extra
Indexが利用できる条件
複合index
indexマージ
不要なindexは容量を食うし、操作を遅くする
type
index or ALL の場合注意インデックスやテーブルがフルスキャンされる。遅い。
Extra
Using filesort, Using temporaryだとやばい
key
予定していたものが使われているか?
from PHP Conference Japan 2021
複合的に見る
Using filesortであってもrowsが数百件なら問題なし
type, rows, Extraなど
type
ALL フルスキャン
index 検索しきれない(対象が多い)
range indexをつかった範囲検索。rowsが多い場合要改善。
const 安心。PKかUKで0/1行を取得最高速
key optimizerが選択したindex
狙いと違うindex奈良注意
rows 検索対象のレコード数
予想より多い場合は注意
Extra
Using index: 高速
indexのみで完結
ただしrowsが多い場合は注意
Using index condition(ICP): 高速
Mysql 5.6以降
rowsが多い場合は注意
Using filesort: 注意
クイックソート
JOIN + ORDER BYするとよく出る
GROUP BYによる暗黙のORDER BYでも出る
LIMIT前のレコード数が多ければ遅い
最初のテーブルをインデックスを用いてソートして、それからJOINするパターン・・・Using filesortの表示がない。
最初のテーブルをFilesortしてからJOINするパターン・・・EXPLAINの最初の行にUsing filesortの表示。
全てのテーブルをJOINしてからFilesortをするパターン・・・EXPLAINの最初の行にUsing temporary; Using filesortの表示。
もちろん後になればなるほど処理が重くなるので、出来るだけそのようなクエリはさけて1番目や2番目の実行計画になるようにすると良いわけである。
最も大切なことはWHERE句における検索条件とソートする対象のカラムを一つのテーブルに集中させることである。
http://nippondanji.blogspot.com/2009/03/using-filesort.html
https://youtu.be/qyrJeTPWEIU
2016/2/20
スライド
MySQL EXPLAINのそれぞれの項目についての覚書 - Qiita
ソシャゲエンジニアの自分が開発に必須だなと思った知識(MySQL編) - Qiita
index系
クラスタインデックス
カバリングインデックス
EXPLAIN で注意するべき値
Cadinality
tableにどんなINDEXがはられているのか確認する
SHOW CREATE TABLE TABLE_NAME;
SHOW INDEX
https://dev.myasql.com/doc/refman/5.6/ja/show-index.html
EXPLAIN
select_type
サブクエリが絡むと次のselect_typeには次の5種類のうちいずれかが表示される。
PRIMARY・・・外部クエリを示す。
SUBQUERY・・・相関関係のないサブクエリ。
DEPENDENT SUBQUERY・・・相関関係のあるサブクエリ。
UNCACHEABLE SUBQUERY・・・実行する度に結果が変わる可能性のあるサブクエリ。
DERIVED・・・FROM句で用いられているサブクエリ。
サブクエリの場合は実行順序に気をつける必要がある。DERIVEDの場合、サブクエリ→外部クエリの順番でクエリが実行される
この場合rowsの見積もりは厳密
サブクエリ(DERIVED)の場合は、実際に実行しないと以降の見積もりができないので正確な値が出される
https://nekootoko3.hatenablog.com/entry/2018/06/16/171613
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
MySQL EXPLAINのそれぞれの項目についての覚書 - Qiita(2020年07月07日)
Type(acces_type) https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain_type
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#jointype_system
MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format
MySQLでクエリの実行計画を表示するコマンド
SQLの実行計画
実行計画を見てクエリをチューニングする
実行計画を見て地道に最適化していく
実行計画のみかた
id
同じidは1回の処理で行われる
JOIN
id: 1
Select type: SIMPLE
実行アルゴリズム:BNL
UNION
先頭のSELECTから順番に処理をする
id: SELECTの数だけある
Select type: PRIMARY, UNION(2つ目以降のSELECT)、UNION RESULT(統合)
サブクエリ
FROMのテーブルがサブクエリの場合
それ以外
リソース
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
Extraフィールドに表示される代表的な追加情報の説明
MySQLはEXPLAINしたときの順番が外部表
#MySQL
PostgreSQL
https://use-the-index-luke.com/ja/sql/explain-plan/postgresql/operations