Open8

MySQLのアーキテクチャについて理解したい

spiquaspiqua

MySQL Server の内部をLayer分けしている記事や図はあるけど、権威がありそうなものはWeb上には見つけられなかった。

ただ各所の出展情報を見るになんとなくMySQL 8 Query Performance Tuningに書いてあるような気がしている。

それでも「ストレージエンジン」と「それ以外」があることは理解できるし、「それ以外」については
Common Database Server Layerと表現しているような雰囲気はある。(確信的なことは言っていないけど...)

spiquaspiqua

/sqlの階層に、
parser_service.cc sql_optimizer.cc sql_executor.cc などがあるので、このあたり処理を追うことでイメージを掴めそう。

挙動をイメージできるような資料

MySQL: CREATE TABLE で CREATE_TABLEしたときの処理の流れが見れる。

MySQL with InnoDB のインデックスの基礎知識とありがちな間違いの「MySQL がレコードを取得する大まかな手順」にexecutorについての解説が乗っていて、その実装が sql_executor.cc にあることが言及されている

spiquaspiqua

明確なエントリポイントは見つけられなかった && 普通に間違ってるかもしれないけど、SELECTをするようなときは、内部では表の上から下の方向に向けて処理が呼び出されてそう。

file func
command_service.cc command_service_run_command
sql/srv_session.cc Srv_session::execute_command
sql/sql_parse.cc dispatch_command
sql/sql_parse.cc dispatch_sql_command
sql/sql_parse.cc mysql_execute_command
sql/sql_select.cc Sql_cmd_dml::execute
sql/sql_select.cc Sql_cmd_dml::execute_inner
sql/sql_union.cc Query_expression::execute
sql/sql_union.cc Query_expression::ExecuteIteratorQuery

このケースだと、dispatch_sql_commandの中で parse_sql されて、Query文字列をASTに変換していそう。
mysql_execute_command は2000行超えるめちゃくちゃでかいswitch文で enum_sql_commandごとに必要な処理をしてる。

Sql_cmd_dml::execute_innerの中でのoptimizeを経て、さらに必要なイテレーターを作成、そのあと Query_expression::ExecuteIteratorQuery でイテレーターが処理されてそう。

spiquaspiqua

executar が呼んでるha_*の関数がStorage Engine Interfaceかと思ったけど、ちょっと自信なくなってきたな

spiquaspiqua

たぶんあってるっぽくて、executarのread_const中で呼ばれてるha_index_init
storage/innobase/handler/ha_innodb.ccint ha_innobase::index_init に対応してそう。