Understanding MySQL Internalsを読む(2)

前回の記事

Status Reporting Module

システム変数、ステータス変数、テーブル情報、レプリケーションの状態、テーブルキャッシュ等を報告する。SHOW系コマンドの処理。ほとんどのコードはsql/sql_show.ccに書かれている。

  • sql/sql_show.cc: mysqld_list_process()
  • sql/sql_show.cc: mysqld_show()
  • sql/sql_show.cc: mysqld_show_create()
  • sql/sql_show.cc: mysqld_show_fields()
  • sql/sql_show.cc: mysqld_show_open_tables()
  • sql/sql_show.cc: mysqld_show_warnings()
  • sql/slave.cc: show_master_info()
  • sql/sql_repl.cc: show_binlog_info()

Abstracted Storage Engine Interface(Table Handler)

ストレージエンジンが実装すべき抽象クラスや設定すべき構造体。handlerクラスおよびhandlerton構造体。

  • sql/handler.h: class handler
  • sql/handler.h: struct handlerton

Storage Engine Implements(MyISAM, InnoDB, MEMORY, NDB Cluster)

handlerクラスを継承したストレージエンジン実装。

これらの他に、内部実装コードは各専用ディレクトリの中に納められている。

  • 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クラスが使われるようになった。

レプリケーション関連については以下も参照。

  • sql/log_event.h および sql/log_event.cc

Replication Master Module

レプリケーションのMaster側の処理を行う。スレーブにバイナリログの差分を送信する。

Replication Slave Module

レプリケーションのSlave側の処理を行う。Masterから新たなログを受け取り、更新内容を反映する。

  • sql/slave.cc: handle_slave_io()
  • sql/slave.cc: handle_slave_sql()

Client/Server Protocol API

MySQLプロトコルを使うための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()

また通信に使用するクラスは以下。

  • sql/protocol.h: class Protocol
  • sql/protocol.h: class Protocol_simple
  • sql/protocol.h: class Protocol_prep
  • sql/protocol.h: class Protocol_cursor

Low-Level Network I/O API

低レベルのネットワークおよびSSL通信のための抽象化API

これらの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のモジュール関連図を元に日本語版(一部改訂)を作ってみた。

ちょとでかいかな。