2018年6月12日火曜日

MySQLとVIEWとオプティマイザと速度

MySQLでは、VIEWを使うと重いと言う人が多いと思います。
ざっとブログを検索した印象ですけど。

結論から言うと、別にVIEWが重いわけではありません。
使おうが使いまいが、INDEXがちゃんと使われていなければ重い、ただそれだけです。

ようするに、使う側の問題です。
知識なしに使えば重くなる場合もあるという事です。

MySQLでは、2種類のVIEWが存在します。
マージ方式と、テンポラリテーブル方式です。
前者は、ただのクエリエイリアスであり、実行する際にクエリを展開します。
後者は事前にテーブルを作成して使います。後者はあまり使うことは無いので省略します。

前者はVIEWを使っても速くならないと思っている人も少なくない感じがします。
同じか少し重いという記事をいくつか目にしました。
しかし実際は、劇的に速くなることもあれば、劇的に重くなることもあります。
全ては使い方次第です。

クエリが同じはずなのに何故速度が異なるのかは、オプティマイザの働き方が若干違う場合があるということだと思います。

EXPLAIN をしてみれば、何が違うのか一目でわかります。
なので、速い方と同じ順番になるよう強制してあげれば、同じ速度になります。

連結順序が違う場合は、STRAIGHT_JOIN を使って、順序を強制しましょう。