subtitle : 2017/8/4 オプト社内勉強会
allotted-time : 30m
渋谷 充宏 @m4buya
- なんでも屋
- サーバーサイドプログラマだった
- Ruby / Scala / インフラ(New!)
- https://github.com/mshibuya
- RailsAdmin/CarrierWave committer
MySQLのEXPLAINのポイントをなんとなくつかめるようになる
- EXPLAINとは
- 事前知識
- EXPLAINで出る各項目の解説
- 時間があればデモ?
- まとめ
こんなやつ
- MySQLがクエリをどう実行しようとしているかを表したもの
- クエリ・テーブル構造・データについての統計情報などをもとに様々な実行プランについてのコストを比較・検討し、最終的な実行プランとなる
データ量は大変重要!
- データの統計情報はデータをもとに概算する
- 本番相当のデータがある環境でないと、本番で選ばれるようなクエリプランが選択されない可能性が高い
- 基本的に実際のデータ取得は走らない
- 実際のパフォーマンスを見るには別途クエリを実行して確かめる必要あり!
- インデックス
- Join
- B+木
こんなやつ
- B+木
特徴
- 浅くて済む
- 順番にたどるのも速い
- インデックスとテーブルデータは別の場所に保存されている
- テーブルスキャンはコストが高いが、(同程度のデータなら)インデックススキャンの方がはるかに高コスト
- テーブルスキャンはシーケンシャルアクセスだが、インデックススキャンはランダムアクセスを要するため
MySQLが実行できるのは Nested Loop Joinのみ!
- 他にはHash JoinとかSort Merge Joinとかある
foreach(rowA in tableA) { foreach(rowB in tableB) { if(結合条件を満たす(rowA, rowB)) 出力(rowA, rowB); } }
- id
- select_type [まぁ重要]
- table
- type [重要]
- possible_keys
- key [まぁ重要]
- key_len
- ref
- rows [重要]
- Extra [重要]
- id
SELECT相当のものにつけられる、他の部分から参照するための番号
- select_type [まぁ重要]
クエリタイプ。単純なやつか、複雑か
- SIMPLE
- PRIMARY
- SUBQUERY
- DERIVED
- UNION
- table
クエリが対象としているテーブル名
読み方
- type [重要]
アクセスタイプ。以下の種類がある
- ALL
- いわゆるテーブルスキャン
- index
- インデックス順での読み取り
- range
- 範囲スキャン
- ref
- インデックス検索
- eq_ref
- ユニークなインデックス検索
- const, system
- 定数値
- NULL
- 最適化によりアクセスを要さなくなった
- possible_keys
利用し得るインデックス名
- key [まぁ重要]
テーブルのスキャンのために利用することに決めたインデックス名
- key_len
利用するインデックスの長さ(バイト数)
- ref
インデックスから探そうとしている値またはカラム名
- rows [重要]
MySQLがクエリを処理するためにだいたい取得することが必要だと判断した行の数。 Nested Loop Joinしているので、内側のテーブルは 外側の行数*内側の行数 ぶんの行取得が走ることに注意!
- Extra [重要]
いろんなのが出る。結構大事なのも出る
- Using where
- Using temporary/Using filesort
- Using index
取得した行のうち、WHERE句にマッチしないものを捨てたことを表す。 インデックスを利用できるようにすれば行の取得自体を削減可能。
ソートやテンポラリテーブルの作成が必要だった時にでる
どちらも出ない時
Using filesortの時
Using temporary; Using filesortの時
カバリングインデックスを利用できた時に出る
- Not exists
- Using index condition
- No tables used
- Select tables optimized away
- EXPLAINとは、MySQLがクエリをどう実行しようとしているかを表したもの
- 正しいEXPLAINを出すには、本番相当のデータを用意する必要がある
- typeにはアクセスタイプが出る
- rowsは各テーブルへのスキャンの分量がわかるので大事
- Extraにはすごく大事な情報がさりげなく出るのでちゃんと見る
- EXPLAIN EXTENDEDするともう少し情報が増える
- filteredとか
- JSON形式で出すともっと情報が増える!(5.7以降)
- EXPLAIN FORMAT=JSON SELECT...
- コストとか見れる
- MySQLのアーキテクチャの話?
- MySQL 5.6 リファレンスマニュアル
- ハイパフォーマンスMySQL 第3版
- 漢(オトコ)のコンピュータ道 Using filesort
これであなたもEXPLAINの達人!!