はじめに
本稿では、MySQLの内部構造を見ていきます。MySQLサーバのさまざまな部分がどのように連携して動いているかを知ることは、楽しくてためになります。MySQLの実装は、テクノロジーの魅惑的な組み合わせです。このテクノロジーは、おびただしい数の開発者の長年にわたる汗とインスピレーションから生み出された、真に目覚ましい功績にほかなりません。
オープンソーステクノロジーの楽しみの1つは、それがオープンソースであるという、まさにその点にあります。MySQLのような巨大なシステムのソースコード(※1)を見ると、そのソフトウェアの進化の過程で開発者たちが直面したジレンマを深く理解することができます。本稿では、サーバ自体のソースコードを詳細に検討していくので、どうぞ心してお読みください。たとえ何も手を加えるつもりがなくても、ソースコードを見てみることをお勧めします。それによって、MySQL ABの開発チームが取り組んでいる作業の途方もない大きさを認識できるようになるだけでなく、このソフトウェアがどのように機能しているか、ひいてはMySQLの長所を最大限に活用し、弱点を回避するために自分のプログラムをどのように最適化すればよいかをより深く理解できます。
本稿で説明する内容は、MySQLデータベースサーバーシステムの内部構造のドキュメント、および実際のソースコードが基になっています。MySQLのコードリポジトリは絶えず進化しているので、ここで説明するデザイン機能の一部は現在では変化している可能性があり、今後も時間の経過とともに変化し続けると思われます。バージョンの異なるソースコードを見比べると、サブシステムの実装や相互関連の方法に違いがあることに気付くでしょう。しかし、システムの全般的な機能の大部分は、ソフトウェアの進化を通じて維持されています。
ここで扱う内容の大部分は、Cプログラミングの達人でなくても理解できるはずです。ここではコード自体よりも、サーバ内部の処理の構造と流れや、さまざまなコードライブラリが互いにやりとりするしくみに重点を置きます。本稿の目的は、読者が自分でソースコードやドキュメントを見て回れるように、基本的なロードマップを示すことです。ただし、一部のセクションには、CおよびC++プログラミングのかなりの知識を必要とする上級者向けの内容も含まれます。Cプログラミングの経験が浅い読者は、あまり気にせずに、できる範囲で理解するよう努めてください。
MySQLのソースコードとドキュメント
ここではMySQLサーバのソースコードを扱うので、本稿の説明を理解し、自らコード調査の冒険に乗り出すために、MySQLの最新のソースコードをダウンロードする必要があります。本稿で使うソースコードは、バージョン5.0.2のソースコードが基になっています。ソースコードをダウンロードするには、MySQLのダウンロードサイトにアクセスし、目的のバージョンをダウンロードします。
ソースコード
ソースコードは、MySQLサーバの主要なライブラリと、各種の拡張機能が含まれる浅いディレクトリツリーで構成されます。
トップレベルのディレクトリ
表1に、トップレベルの主要なすべてのディレクトリと、各ディレクトリにあるファイルの簡単な説明、およびファイルの一般的な用途を示します。以降の説明では、この表に示す情報を、各サブシステムに関連するより小さなグループに分類していきます。この大きな表をリファレンスとして使用するとよいでしょう。
ディレクトリ | 内容 |
/bdb | Berkeley DBストレージエンジンハンドラの実装ファイル |
/BUILD | プログラムコンパイルファイル |
/client | mysqlコマンドツール(クライアントプログラム)の実装ファイル |
/data | mysqlデータベース(システムデータベース)のスキーマ、データ、およびインデックスファイル |
/dbug | デバッグ用のユーティリティコード |
/Docs | ドキュメント(内部構造の開発者用ドキュメントとMySQLオンラインマニュアル) |
/heap | MEMORYストレージエンジンハンドラの実装ファイル |
/include | コアシステムのヘッダーファイルおよび型定義 |
/innobase | InnoDBストレージエンジンハンドラの実装ファイル |
/isam | 古いISAMストレージエンジンハンドラの実装ファイル |
/libmysql | MySQL CクライアントAPI(すべてのCソースファイルおよびヘッダーファイル) |
/libmysqld | MySQLサーバーコアライブラリ(C、C++、および一部のヘッダーファイル) |
/libmysqltest | MySQLのテスト用の簡単なプログラム |
/merge | 古いMergeストレージエンジンハンドラの実装ファイル |
/myisam | MyISAMストレージエンジンハンドラの実装ファイル |
/myisammrg | MyISAM Mergeストレージエンジンハンドラの実装ファイル |
/mysys | コア関数ライブラリ、および低レベルの基本関数 |
/regex | 正規表現関数ライブラリ |
/scripts | 共通ユーティリティのシェルスクリプト |
/share | 国際化されたエラーメッセージ |
/sql | サーバの実装の本体、およびサーバとクライアントのすべての主要な処理のコアクラスと実装 |
/sql-bench | MySQLのベンチマーク用シェルスクリプト |
/strings | 低レベルの文字列処理関数 |
/support-files | 設定済みのMySQL設定ファイル(my-huge. cnfなど) |
/tests | テストプログラムとスクリプト |
/vio | ネットワーク/ソケットユーティリティ機能、仮想I/O、SSLなど |
/zlib | 圧縮機能のソースファイル |
ここで少し時間を取り、ソースコードを見て回って楽しんでもかまいませんが、きっとすぐにソース配布物を構成するクラス、構造体、およびC関数の迷路で迷子になってしまうでしょう。最初に参照すべき場所は、/Docsディレクトリにある配布物のドキュメントです。その後で、本稿の説明に従って主要なサブシステムや、さまざまなシステム機能に対応するコアファイルがある場所を見ていきます。