メモ > 技術 > データベース: MySQL > チューニング(実行計画)
チューニング(実行計画)
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
http://nippondanji.blogspot.com/2009/03/mysqlexplain.html
MySQL EXPLAINの見方 - Qiita
https://qiita.com/Stuffy86/items/809540b73cacde951997
例えば以下のようなSQLがあったとして、
SELECT id, created, name FROM students LIMIT 100;
このSQLの直前に「EXPLAIN」を付けると実行計画を表示でき、この情報をもとにボトルネックを探してチューニングすることができる
一例だが、以下のように表示される
> EXPLAIN SELECT id, created, name FROM students LIMIT 100;
+------+-------------+----------+------+---------------+------+---------+------+-------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+------+---------------+------+---------+------+-------+-------+
| 1 | SIMPLE | students | ALL | NULL | NULL | NULL | NULL | 70288 | |
+------+-------------+----------+------+---------------+------+---------+------+-------+-------+
> EXPLAIN SELECT id, created, name FROM students WHERE name = '山田太郎' LIMIT 100;
+------+-------------+----------+------+----------------+----------------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+------+----------------+----------------+---------+-------+------+-----------------------+
| 1 | SIMPLE | students | ref | index_name_sei | index_name_sei | 767 | const | 398 | Using index condition |
+------+-------------+----------+------+----------------+----------------+---------+-------+------+-----------------------+
結果の意味は以下のとおり
ひとまずは「select_type」と「type」を確認すると良さそう
■id
実行順序
select_typeとセットで確認する
■select_type
SIMPLE … サブクエリやユニオンが含まれていない、単純なSELECT文
SUBQUERY … サブクエリに指定されているSELECT文
PRIMARY … ユニオンの1つ目のSELECT文
UNION … ユニオンの2つ目以降のSELECT文
UNION_RESULT … ユニオンの無名一時テーブルから結果を取得するSELECT文
■table
対象のテーブル名
■type
テーブルへのアクセス方法
const … インデックスによる検索。最速
eq_ref … JOINで用いられる、インデックスによる検索
ref … ユニーク(PRIMARY or UNIQUE)ではないインデックスを使って等価検索(WHERE key = value)を行なった検索
range … インデックスを用いた範囲検索
index … フルインデックススキャン。インデックスがはられていること以外はALLと同じなので遅い
ALL … フルテーブルスキャン。インデックスがまったく利用されていないので改善が必要。遅い
■possible_keys
検索に使用できるインデックス
「NULL」の場合は参照するインデックスが無い
■key
検索に使用されたインデックス
■key_len
検索に使用されたインデックスの長さ
■ref
検索条件でkeyと比較されている値やカラムの種類
定数が指定されている場合は「const」と表示される
■rows
テーブルから取得される行数の見積もり
大まかな見積もりなので正確では無い
■Extra
クエリを実行するために、どのような戦略を選択したかを示す
以下は一例
Using where … 頻繁に出力される追加情報。WHERE句に検索条件が指定されており、なおかつインデックスを見ただけではWHERE句の条件を全て適用することができない場合
Using index … クエリがインデックスだけを用いて解決できることを示す
Using filesort … filesort(クイックソート)でソートを行っていることを示す
Using temporary … JOINの結果をソートしたり、DISTINCTによる重複の排除を行う場合など、クエリの実行にテンポラリテーブルが必要なことを示す。
■メモ
引き続き確認したい
あなたの遅延はどこから? SQLから! 〜患部に止まってすぐ効くSQLレビューチェックリスト 年初め特大サービス号〜 - ANDPAD Tech Blog
https://tech.andpad.co.jp/entry/2023/01/12/100000
MySQLのExplainを確認する - woshidan's blog
https://woshidan.hatenablog.com/entry/2015/06/20/165817
MySQLのexplainとかについてしらべたときのメモ - Qiita
https://qiita.com/lastcat_/items/de7b530a94fbcf9ba646
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
漢(オトコ)のコンピュータ道: MySQLを高速化する10の方法
http://nippondanji.blogspot.jp/2009/02/mysql10.html
ヤフー社内でやってるMySQLチューニングセミナー大公開
https://www.slideshare.net/techblogyahoo/mysql-58540246
Cygamesを支えるPHPと、その高速化の取り組み // Speaker Deck
https://speakerdeck.com/cygames/cygameswozhi-eruphpto-sofalsegao-su-hua-falsequ-rizu-mi
秒間100万クエリを受け付ける大規模ソーシャルゲームのバックエンドDBシステムの設計・運用ノウハウ // Speaker Deck
https://speakerdeck.com/cygames/miao-jian-100mo-kueriwoshou-kefu-keruda-gui-mo-sosiyarugemufalsebatu...
MySQL with InnoDB のインデックスの基礎知識とありがちな間違い - クックパッド開発者ブログ
http://techlife.cookpad.com/entry/2017/04/18/092524
MySQLでWhere句内でOR演算子を使うと「インデックスが効かなくなる」は本当か
https://zenn.dev/nakasone/articles/ce989fa4cbe4c2
これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(クエリ編) | 株式会社インフィニットループ技術ブログ
http://www.infiniteloop.co.jp/blog/2012/03/mysql-tuning-cacti-query/
これだけ見れば大丈夫!ーMySQLパフォーマンス監視のツボ(システム編) | 株式会社インフィニットループ技術ブログ
https://www.infiniteloop.co.jp/blog/2013/08/mysql-tuning-cacti-system/
MySQL クエリーキャッシュ 【チューニング方法とかも】 - Qiita
https://qiita.com/ryurock/items/9f561e486bfba4221747
MySQL クエリーキャッシュ 【チューニング方法とかも】 - Qiita
https://qiita.com/ryurock/items/9f561e486bfba4221747
DSAS開発者の部屋:クエリキャッシュは切ったほうがいいんじゃなイカ?
http://dsas.blog.klab.org/archives/52021866.html
MySQLでプライマリキーをUUIDにする前に知っておいて欲しいこと | Raccoon Tech Blog [株式会社ラクーンホールディングス 技術戦略部ブログ]
https://techblog.raccoon.ne.jp/archives/1627262796.html
SQLを速くするぞ―お手軽パフォーマンス・チューニング
https://mickindex.sakura.ne.jp/database/db_optimize.html
データベースの仕組み(アーキテクチャ)をざっくり理解する
https://zenn.dev/revenuehack/articles/dc5a901fbe90e6
MySQLで全文検索機能を使う際のパフォーマンスについて調査してみた - iimon tech blog
https://tech.iimon.co.jp/entry/2023/12/01/113000