第12章 ストレージエンジン
ストレージエンジンとは
MySQLには、テーブルごとにデータのストレージエンジンを選ぶことができます。その主なものには、InnoDB、MyISAM、Memory、CSVなどがあります。
- InnoDB: トランザクションセーフで、ACID準拠をサポートしています。また、行レベルのロックや外部キー制約もサポートしています。これらの機能は、データの整合性を保つための重要な特性です。そのため、InnoDBはより堅牢なデータ管理が必要な商用アプリケーションでよく使われます。
- MyISAM: InnoDBとは対照的に、MyISAMはトランザクションや外部キー制約をサポートしていませんが、フルテキスト検索の機能をサポートしています。そのため、大量のデータを高速に検索する必要があるような用途(例えば、ウェブ検索エンジン)で使われます。
- Memory: データとインデックスをメモリ内に格納します。そのため、データアクセスは非常に高速ですが、サーバーがシャットダウンするとデータは失われます。一時的なデータ格納やキャッシュなど、永続性が必要ない場合に使われます。
- NDB: MySQLの分散ストレージエンジンです。通常、「MySQL Cluster」とも呼ばれ、複数のノード(サーバ)上で動作し、高い可用性とスケーラビリティを提供します。
InnoDB
- トランザクションのサポート: InnoDBは完全なACIDモデルをサポートしています。これには、コミット、ロールバック、およびクラッシュリカバリ機能が含まれます。
- 行レベルのロック: InnoDBは、読み取り/書き込み並行性を高めるために行レベルのロックを提供します。これは他の多くのデータベースエンジンがテーブルレベルのロックを使用するのとは対照的です。
- 外部キー制約: InnoDBストレージエンジンは外部キー制約をサポートし、これによりデータの整合性を維持します。
- クラッシュリカバリ: InnoDBはトランザクションログ、ダブルライトバッファ、チェックポイントなどを用いて、データベースのクラッシュからリカバリできます。
- MVCC (Multi-Version Concurrency Control): これにより、一つのトランザクションが行をロックすることなく、他のトランザクションによって同時にその行が読み取られることを可能にします。これは高度な読み取り/書き込み並行性を可能にします。
- B+Treeインデックス: InnoDBはデータの格納と検索にB+Treeインデックスを使用します。これにより、全テーブルスキャンを回避し、大規模なデータセットに対して効率的な検索とソーティングを実現します。
注意すべきは、InnoDBは高度な機能を提供する一方で、これらの機能をサポートするためのオーバーヘッドがあるため、小さな単純な読み取り専用のクエリに対しては、他のストレージエンジン(例えばMyISAM)がより効率的である可能性があるという点です。しかし、トランザクションの整合性や耐久性を必要とするアプリケーションにとっては、InnoDBは一般的に最良の選択です。
MyISAM
- テーブルレベルのロック:MyISAMではテーブルレベルのロックを使用します。これは、大量のデータを一度に読み取ることが多い場合や、データの変更が頻繁に行われない状況では効率的ですが、頻繁な更新が必要なアプリケーションには適していません。
- フルテキスト検索のインデックス:MyISAMはフルテキスト検索インデックスをサポートしており、これにより大量のテキストデータに対する高速な検索を行うことができます。
- 圧縮テーブル:MyISAMでは、読み取り専用のテーブルを圧縮してディスクスペースを節約することが可能です。
- ジオメトリデータ型のサポート:MyISAMはジオメトリデータ型をサポートし、空間インデックスを提供しています。これにより、地理空間データを効率的に検索することが可能です。
- 非トランザクション性:MyISAMはトランザクションをサポートしていません。つまり、一連の操作を一つの単位としてまとめて実行し、途中で失敗した場合にはロールバックできません。
- クラッシュリカバリの欠如:MyISAMはトランザクションログを保持しておらず、サーバーのクラッシュ後の自動リカバリは行いません。
現在では、トランザクションのサポートや行レベルのロックが必要な場合、またはデータの完全性を維持する必要がある場合は、InnoDBの使用が推奨されています。しかし、読み取り専用の大量のデータを扱うアプリケーション、またはフルテキスト検索を利用する場合など、特定のケースにはMyISAMが適していることもあります。
Memory
- 高速なアクセス:すべてのデータがメモリ上に格納されるため、データへのアクセスが非常に高速です。そのため、一時的なデータの格納や大量のデータの読み取りなど、高速なパフォーマンスが必要な場合に適しています。
- テーブルレベルのロック:Memoryストレージエンジンは、デフォルトではテーブルレベルのロックを使用します。ただし、MySQL 5.7.5以降では、オプションで行レベルのロックを使用することも可能です。
- 非永続性:Memoryストレージエンジンは非永続性で、サーバーの再起動やクラッシュによってテーブルのデータが失われます。そのため、永続性が必要なデータには適していません。
- ハッシュインデックスとB-Treeインデックスのサポート:MemoryストレージエンジンはハッシュインデックスとB-Treeインデックスの両方をサポートしています。ハッシュインデックスは等価検索に非常に効率的で、B-Treeインデックスは範囲検索やソート操作に効率的です。
- 制限付きデータ型のサポート:MemoryストレージエンジンはBLOBやTEXT型のデータはサポートしていません。また、メモリ使用量はシステム変数max_heap_table_sizeによって制限されます。
Memoryストレージエンジンは、高速なアクセスが必要で、データの永続性が要求されない特定のケースにおいて、非常に有用です。一時テーブルやキャッシュテーブルとしてよく使用されます。しかし、大量のデータや永続的なデータを扱う場合、またはトランザクションのサポートが必要な場合は、InnoDBのような別のストレージエンジンを使用することが推奨されます。
NDB
- 高い可用性:NDBクラスタは、ネットワーク内の複数のノード間でデータを自動的にレプリケーションし、冗長性を提供します。これにより、一部のノードがダウンしても他のノードがサービスを継続でき、高い可用性を実現します。
- オンラインスケーラビリティ:ノードを追加することで、NDBクラスタの容量と性能を動的に拡張できます。これは、アプリケーションの需要が急増した場合や、大量のデータを処理する必要がある場合に有用です。
- リアルタイム性:NDBクラスタは、ミリ秒単位のレイテンシと高いスループットを提供し、リアルタイムのアプリケーションで利用できます。
- トランザクションのサポート:NDBクラスタは、ACID (Atomicity, Consistency, Isolation, Durability) 特性を持つトランザクションをサポートしています。
- 分散データの処理:NDBクラスタは、ネットワーク内の複数のノードにデータを分散させて保存・処理することができます。
それらの特徴から、NDBクラスタは通信、ゲーム、金融サービスなど、高い可用性とスケーラビリティ、リアルタイム性を必要とするアプリケーションに適しています。ただし、設定や管理が複雑なため、その分のコストとリソースを考慮する必要があります。また、すべてのMySQLの機能が利用可能なわけではなく、利用可能な機能や制限事項については、公式のドキュメンテーションを参照することが重要です。