MySQL独自のストレージエンジン
他のRDBMS同様、様々なプログラミング言語からアクセスするためのドライバ類が用意されています。MySQLではこれらをコネクタ(Connector)と読んでいます。アプリケーションからのアクセスではこれらの経由でMySQLサーバに接続後、ユーザ名やパスワードによる認証を通過します。その後SQL文がパーサ(Parser)にて構文解析され、オプティマイザ(Optimizer)にて実行計画が最適化されます。
実際にどのようにデータを格納するか、トランザクションを処理するかなどはMySQL独自の「ストレージエンジン」で実装されています。他のデータベース製品ではこのストレージエンジンを実装していません。ストレージエンジンはデータベースの表ごとに設定できるため、ストレージエンジンを切り替えることでアプリケーション特性に応じた最適なパフォーマンスを発揮することができます。主要なストレージエンジンはオラクル社でMySQLサーバとあわせて開発されています。他にもユニークな機能を持ったものや特定の用途に対応したストレージエンジンなどが、コミュニティや様々な企業で開発されています。
ストレージエンジンの役割
ストレージエンジンの役割は大きく分けて下記の6点になります。
データ保管 | どこに格納するか、データレイアウト |
インデックス | 実装アルゴリズム (Btree, B+, T etc) |
メモリ利用 | データキャッシュ、バッファリング |
トランザクション | ACID、分散トランザクション、MVCC、分離レベル |
同時実行性 | ロック、排他制御 |
独自機能 | MyISAMの空間情報インデックスなど |
多くのストレージエンジンはデータをディスク上に格納しますが、MEMORYストレージエンジンはデータをメインメモリに格納するため、特定の表だけをインメモリデータベースとして扱うこともできます。一方でMySQLサーバで使用するSQL文は多くの場合ストレージエンジンに依存しないため、一つのSQL文の中でディスクにデータを格納した表のデータとインメモリデータベースのデータをJOINすることも可能です。
代表的なストレージエンジン
InnoDB | デフォルトのエンジン、トランザクション対応、外部キーサポート |
MyISAM | MySQL 5.1以前のデフォルト、ファイルシステムの置き換え |
Memory | 特定のテーブルをインメモリデータベースに |
Archive | SELECTおよびINSERTのみ可能、圧縮、ロギングや監査など |
NDBCLUSTER | 非共有型クラスタMySQL Clusterの実装、高可用性構成 |
CSV | データをCSVファイルに格納しSQL文で参照更新 |
Merge | MyISAMのテーブルをパーティションとして扱うためのエンジン |
Federated | 別のMySQLサーバ上のテーブルに透過的にアクセス |
Example | エンジンを開発するためのベース |
Blackhole | 書き込んだデータを全て飲み込む”/dev/null”的なエンジン |
MySQL 5.5ではInnoDBの性能が大幅に向上しており、最近のアプリケーションではトランザクションが必須となるケースが多いことInnoDBの利用が特に多くなっています。多くのユーザが使用しているエンジンは、他にMyISAM、Memory、Archiveです。ただし、MyISAMはデータファイルが容易に破損することがあり得るため、テーブルレベルロックで並列処理性能に課題があるため、利用は減少傾向にあります。