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

MySQLのアーキテクチャについて理解したい
公式ドキュメントではこれ。
ただ私の記憶では、Parser -> Optimizer -> Executar と処理が行われ、Executar がストレージエンジンに対して操作をしているイメージがあった。前述の図ではそこまで表現されていないので深掘りをしたい。

MySQL Server の内部をLayer分けしている記事や図はあるけど、権威がありそうなものはWeb上には見つけられなかった。
ただ各所の出展情報を見るになんとなくMySQL 8 Query Performance Tuningに書いてあるような気がしている。
それでも「ストレージエンジン」と「それ以外」があることは理解できるし、「それ以外」については
Common Database Server Layerと表現しているような雰囲気はある。(確信的なことは言っていないけど...)

MySQLのコードリーディングをしていく。
https://github.com/mysql/mysql-server/tree/trunk (trunkを見たが、9.0のイノベーションリリースが始まっている最中なので、実務に即するなら 8.4とかを見たほうがいいかも)

/sqlの階層に、
parser_service.cc
sql_optimizer.cc
sql_executor.cc
などがあるので、このあたり処理を追うことでイメージを掴めそう。
挙動をイメージできるような資料
MySQL: CREATE TABLE で CREATE_TABLEしたときの処理の流れが見れる。
MySQL with InnoDB のインデックスの基礎知識とありがちな間違いの「MySQL がレコードを取得する大まかな手順」にexecutorについての解説が乗っていて、その実装が sql_executor.cc
にあることが言及されている

明確なエントリポイントは見つけられなかった && 普通に間違ってるかもしれないけど、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
でイテレーターが処理されてそう。

イテレーターを呼び出しているのは下記とかm_root_iterator->Read();
が 0を返したらループを継続して、-1,1を返したら終了になるようになっているっぽさ

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

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