EXPLAINの見方
オプティマイザがテーブルがどの順序でJOINするか、それぞれのテーブルでどのインデックスを使用するか、または使用しない(テーブルスキャン)かを知るためのコマンドがEXPLAINだ。執筆時点現在(2011年10月)の最新のGAバージョンでは、EXPLAINがサポートするクエリのタイプはSELECTだけであるが、最新の開発版であるバージョン5.6.3では、UPDATE、DELETE、INSERT、REPLACEの実行計画を見ることが出来るようになった。興味のある人はぜひ試していただきたい。
本エントリでは、JOINにおけるEXPLAINの見方についての解説にターゲットを絞る。サブクエリまたはUNIONを含むクエリについては実行計画がJOINの場合とは異なる(つまり複数のJOINから構成されると考えられる)が、それらについては別の機会に扱いたい。MySQLでは、JOINがSELECTを構成する単位として扱われる。最もシンプルなクエリはテーブルがJOINをしないクエリ、つまりひとつのテーブルを対象としたクエリであるが、それはJOINを0回行う特殊なケースであると考えることができる。
以下はMySQLの公式サンプルデータベースであるworldデータベースInnoDB版を使ったEXPLAINの例である。
mysql> explain select * from City JOIN Country on (City.Id = Country.Capital) where Country.name like 'j%'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: Country type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 234 Extra: Using where *************************** 2. row *************************** id: 1 select_type: SIMPLE table: City type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: world_innodb.Country.Capital rows: 1 Extra: 2 rows in set (0.00 sec)
それではこの出力結果の見方について説明しよう。