まとめ
今回はMySQLが実装しているJOINの方式であるNLJのアルゴリズムと、オプティマイザの動作の概要、そしてオプティマイザによる実行計画を調べるEXPLAINについて説明した。MySQLはNLJが基本であり、NLJについての理解なくしてチューニングはあり得ないと言っても過言ではない。
NLJは内部表へのアクセスにおいてインデックスが使用されている、つまりレコードアクセスタイプがeq_refまたはrefの場合にはとても高速に動作する。だが、インデックスを使えない場合にはNLJは効率が良くない。MySQLにはJOINでインデックスを使えない場合の対処として、Block Nested Loop Join(BNLJ)というNLJの改良型のアルゴリズムが実装されており、単純なNLJと比べると少しだけ効率が改善されるようになっている。また、バージョン5.6.3では、既存のNLJの改良型であるBatched Key Access Join(BKA Join)も導入された。次回はこれらのアルゴリズムを中心に、引き続きクエリのチューニングについて解説しよう。