半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。
MySQLの歴史
1979年に、TcXという会社に務めていたMonty Wideniusによって16KB RAM搭載の4MHzコンピュータで動くBasicで書かれたレポーティングツールを作ったのがMySQLの歴史の始まりです。
その後、このツールはCで書きなおされ、Unixで動くように移植されます。
まだこの頃は、レポーティングフロントエンドを備えた低レベルのストレージエンジンでしかありませんでした。
※このツールは、Uniregという名で知られていました
1990年代に入り、TcXの顧客は自分が保有するデータ用のSQLインタフェースを強く要求し始めました。
その中で幾つかの可能性の1つとして、商用データベースにそれをロードすることでしたが、Montyはそのスピードに納得がいかなかったので、SQL部分にmSQLのコードを採用し、それを自分の低レベルのストレージエンジンと統合してみました。
だが、上手く動作しなかったので、Montyは自分で作ることにしました。
こうして1996年5月に、MySQLバージョン1.0がクローズドリリースされました。
その後、1996年10月にバージョン3.11.1が公式にリリースされることになりました。
このバージョンでは、バイナリディストリビューションのみがSolaris向けに提供されました。
そして、その一ヶ月後に、ソースとLinuxバイナリがリリースされました。
その後2年の間に、機能セットが充実してきたこともあり、MySQLは他の多くのオペレーティングシステムに移植されました。
MySQLは、当初は自分たちのソフトウェアと一緒にそれを再頒布する意志のない人々にのみ商用で使用する許可を与えた特別なライセンスの下でリリースされていました。そして、商用のサポートも実施されました。
この期間で、MySQLはバージョン3.22へと進化しました。
このバージョンでは、SQL言語の正規のサブセットをサポートし、期待以上の高性能なオプティマイザを備えるだけでなく、極めて高速かつ安定したものになりました。
また、数多くのAPIの提供がされてことによって、既存のプログラミング言語でクライアントを記述することも出来るようになりました。
しかしそれは、トランザクション、サブクエリ、外部キー、ストアドプロシージャ、ビューのサポートに欠けていたため、ロックはテーブルレベルでしか起きず、速度が落ちて予期せぬ中断などが起きることもありました。
そういった経緯もあって、その制限を回避できないプログラマには、MySQLをおもちゃだと考えるものもいました。
しかし、その一方でOracleやSQL ServerからMySQLに乗り換えて、パフォーマンス改善やライセンス費用節約の見返りとして自分たちのコードでそれらの制限を回避する人もいました。
1999年から2000年にかけて、MySQL ABという名前の別会社が設立されました。この会社は、Berkeley DBデータファイル用のSQLインタフェースを提供するSleepycatと業務提携を行うことになります。
Berkeley DBはトランザクション機能を備えていたので、これによって欠いていたトランザクション機能がMySQLでサポートされることになりました。そして、Berkeley DBを組み込むためにの準備段階でコードに幾つかの変更が入った後に、バージョン3.23がリリースされました。
しかし、このリリースではBerkeley DBインタフェースのあらゆる癖を解決できたと言えるものではなく、Berkeley DBテーブルは安定しませんでした。しかし、この労力は徒労に終わりませんでした。
なぜなら、結果としてMySQLソースには、トランザクションストレージエンジンを含むあらゆるタイプのストレージエンジンを追加するためのフックがこの時に装備されることになったからです。
2004年4月迄に、Slashdotからのサポートによりマスターレプリケーション機能が追加されました。古い非トランザクションストレージエンジンISAMは手を加えられ、MyISAMとしてリリースされました。
多くの改良項目の中で、フルテキスト検索機能は今でもサポートされています。その後、行レベルロックを備えるトランザクショナルエンジンGeminiを追加すべく行ったNuSphereとの業務提携は短命に終わり、2001年末まで続く訴訟へと通じることになります。
しかし、時を同じくしてHeikki Tuuriが自社開発したストレージエンジンInnoDBを組み込まないかという提案をMySQL ABに持ちかけていました。InnoDBもGeminiと同じようにトランザクションと行レベルでのロックの双方の機能を備えていました。
Heikkiのエンジンは、Berkeley DBの統合努力によって磨きがかけられた新しいテーブルハンドラインタフェースとスムーズに連携しました。
MySQL/InnoDBの統合バージョン4.0となって結実し、2001年10月にアルファ版としてリリースされました。
2002年始めまでに、MySQL/InnoDBの統合は安定しただけでなく、別レベルへとMySQLを進化させました。
バージョン4.0は、最終的に2003年3月に製品(安定版)としてリリースされました。
MySQL開発者は常にInnoDBを重要な追加要素としてみなしてきたが、決してMySQLの成功のために全面的に依存するものであるとは考えてはいない。その為、バージョン4.0で最も重要な追加機能はクエリキャッシュである。なぜなら、この機能によってかなりの数のアプリケーションのパフォーマンスが大幅に改善されたからである。
このタイミングで、スレーブのレプリケーションコードは2つのスレッドを使うように書き直された。1つはマスタからネットワークI/Oのためのスレッド、もう1つは更新を処理するためのスレッドである。
また、オプティマイザにも幾つかの改良がなされ、そしてクライアント/サーバプロトコルはSSL対応になった。
次のバージョン4.1は、2003年の4月にアルファ版としてリリースされ、2006年6月にベータ版として宣言された。バージョン4.1では4.0以上に多くの重要な改良が行われた。その中でも最も重要な改良点は多くのユーザが待ち望んでいた、サブクエリである。
また、MyISAMストレージエンジンには、空間インデックスのサポートが追加された。そして、このバージョンでUnicodeサポートも実装された。その他にもクライアント/サーバプロトコルにも多くの変更がされるなど、より安全なものへとなっていった。プリペアードステートメントもこの時にサポートされた。
実は、バージョン5.0はバージョン4.1のアルファ版と並行して別ブランチで開発されていた。バージョン5.0には、ストアドプロシージャ、サーバサイドカーソル、トリガー、ビュー、XAトランザクション、クエリオプティマイザ内の重要な改良、および他の多くの機能が追加される予定になっていた。別のブランチで開発されていたのは、5.0で追加される全ての新しい機能に加えストアドプロシージャを扱った場合4.1を安定させるのには、かなりの時間を要することになるだろうという危機感をMySQL開発者が抱いたからだった。
バージョン5.0は、最終的には2003年12月にアルファ版がリリースされた。しかし、アルファ段階に2つブランチが存在するということによって
多くの人に混乱を招いたのである。この混乱は、バージョン4.1が安定版になった2004年10月まで続いた。そしてその1年後の2005年10月に、バージョン5.0は安定版になった。
5.1の最初のアルファ版は多くの改良を伴い2005年11月にリリースされました。改良点には、テーブルデータパーティショニング、行ベースのレプリケーション、イベントスケジューラ、そして新しいストレージエンジンと他のプラグインの統合を容易にする標準化されたプラグインAPIがあります。
参考:詳解MySQL