MySQLのinner joinで結合条件を省略するとどうなるか
最近ユーザー数の増加に伴いSQLのチューニングを任されることが多くなって来たので、JOINやUNION等について調べています。標題は前々から気になっていました。結果は得られますが果たしてどう演算されているのか。MySQLで別テーブルを内部結合する際にON条件をつけるのはお約束ですが無指定だと。。。
参考サイト
http://dev.mysql.com/doc/refman/5.1/ja/join.html
http://java-etc.cocolog-nifty.com/blog/2007/02/post_a311.html
INNER JOINとNATURAL JOIN
NATURAL JOINは使ったことがありませんが、結合するそれぞれのキーと共有するキーを対応させて結果を求めているようです。INNER JOINとの決定的な違いは実行計画を見たときにはっきりとでました。
実行計画を見たところ
INNER JOINで特にキーを指定しなかった場合は全てのテーブルをALL検索しました。
対して、NATURAL JOINの場合、対応するキーにインデックスが貼られてる場合そのインデックスを用いて計算していました。
外部キー制約との相性
外部キー制約(foreign key) を用いている場合、USINGに指定できる形の共通したキーにはインデックスを効かせる事が可能でした。
複合インデックスが貼ってあった場合は優先的にそちらが採用されるのか、index mergeは起きるのか等まだまだ試せてないですがそのうち試して見ようと思います。