オプティマイザの概要

August 10, 2018

MySQL のオプティマイザの構造

オプティマイザとは「式の等価な変換」によって得られる複数の実行計画から、最適なものを選んで選択する仕組みとなる。例えば内部結合 (INNER JOIN) の順序を入れ替えることであったり、WHERE 句の評価順を入れ替える、あるいはサブクエリを別のアルゴリズムに置き換える、というようなことを指す。

MySQL のオプティマイザはコストベースのオプティマイザであり、どのような実行計画でクエリを実行したとき、どのくらいコストがかかるかを計算し、最もコストが低くなるものを選択するようになっている。ただし、コストの見積もりは所詮見積もりであり、正確なコストは実際に実行するまではわからない。実際、オプティマイザはほとんどの場合良い働きをするが、たまに調整が必要になることもある。

SQL 実行の流れ

オプティマイザは最適な実行計画を選択するための機能であるが、SQL 文そのものを直接見て判断するわけではない。SQL 文はまずパーサー (構文解析器) により解析され、コンピュータが扱いやすい形に変えられる。具体的には AST (Abstracted Structure Tree, 抽象構文木) という形式となる。オプティマイザはこの AST 形式で最適な実行計画を探すことになる。等価な結果を生む別の AST へと書き換えたあと、エグゼキュータ (実行器) へ制御を移し、実行する。エグゼキュータはオプティマイザから渡された実行計画に基づいて実際にテーブルから行を取得し、結果を生成する。

f:id:shiro_kochi:2018××××××××:plain:w100:left

エグゼキュータがどれだけの仕事をしなければいけないかは、クエリの内容とオプティマイザの能力により決まる。オプティマイザが優秀であれば、効率が悪い実行計画を選ぶ確率が減るため、エグゼキュータの仕事量も相対的に下がることになる。


 © 2023, Dealing with Ambiguity