Understanding MySQL Internalsを読む(2)
前回の記事
Status Reporting Module
システム変数、ステータス変数、テーブル情報、レプリケーションの状態、テーブルキャッシュ等を報告する。SHOW系コマンドの処理。ほとんどのコードはsql/sql_show.ccに書かれている。
Abstracted Storage Engine Interface(Table Handler)
ストレージエンジンが実装すべき抽象クラスや設定すべき構造体。handlerクラスおよびhandlerton構造体。
Storage Engine Implements(MyISAM, InnoDB, MEMORY, NDB Cluster)
handlerクラスを継承したストレージエンジン実装。
- sql/ha_myisam.h および sql/ha_myisam.cc
- sql/ha_innodb.h および sql/ha_innodb.cc
- sql/ha_heap.h および sql/ha_heap.cc
- sql/ha_ndbcluster.h および sql/ha_ndbcluster.cc
これらの他に、内部実装コードは各専用ディレクトリの中に納められている。
- myisam/
- innobase/
- heap/
- ndb/
非常に軽いストレージエンジンについては、sql/ha_XXX.hhおよびsql/ha_XXX.ccのみの場合もある。Federatedとか。
Logging Module
一般クエリログ、バイナリログ、スロークエリログの出力。MySQL5.0まではMYSQL_LOGクラスにほとんど実装されていたものの、MySQL5.1では改良(動的ON/OFFなど)が行われてMYSQL_LOGクラスを継承するTC_LOGクラスが使われるようになった。
レプリケーション関連については以下も参照。
Replication Master Module
レプリケーションのMaster側の処理を行う。スレーブにバイナリログの差分を送信する。
Replication Slave Module
レプリケーションのSlave側の処理を行う。Masterから新たなログを受け取り、更新内容を反映する。
Client/Server Protocol API
- sql/net_serv.cc: my_net_read()
- sql/net_srev.cc: my_net_write()
- sql/protocol.cc: net_store_data()
- sql/protocol.cc: send_ok()
- sql/protocol.cc: send_error()
また通信に使用するクラスは以下。
Low-Level Network I/O API
低レベルのネットワークおよびSSL通信のための抽象化API。
- vioディレクトリにある名前がvio_から始まる関数群
これらのAPIにより、MySQLプロトコルを実装する開発者は通信手段が何なのか(SSLなのか通常TCP/IPなのかUnix Domain Socketなのか)を気にせずにプロトコルを実装することが可能。
Core API
MySQLにおける「十徳ナイフ」的な位置付け。I/O関連のコードをポータブルに書くためのAPIや、メモリ管理、文字列操作などのためのユーティリティ系API。多くの関数は"my_"というprefixが付いている。
mysysディレクトリにあるコードは「Monty's magic」と呼ばれてたなぁ確か。MontyはMySQLの生みの親で、大昔MySQLが未だMySQLという名前とかSQLインタフェースを持っていなかった時代、最初に人気が出たのはこのMontyが書いていたコードが非常に高速・安定していたからという話。MySQLの貴重な資産ですな。文字列操作とかアセンブラで高速化してるし。
まとめ
というわけでMySQL全体を意味のある粒度のモジュールに分割して定義し、各モジュールの役割とそのモジュールに関連するコードを読む際の入口とすべき関数名を提示してみました。これまでとっかかりが無くて手を出しにくかった場合にも、少しは楽になるんじゃないでしょうか。
おまけ
P.8のモジュール関連図を元に日本語版(一部改訂)を作ってみた。
ちょとでかいかな。