記事ディレクトリ
0. 序文
MySQL は、世界で最も人気のあるオープンソース リレーショナル データベース管理システムの 1 つです。MySQL的一个主要特性是其插件式存储引擎架构
つまり、特定のワークロードとニーズに基づいて別のストレージ エンジンを選択できます。
複数のストレージ エンジンをサポートします。MySQLのストレージ エンジンについて、 、InnoDB
などを含めて詳しく説明します。各ストレージ エンジンにはそれぞれのアプリケーション シナリオと特性があり、どのエンジンを選択するかはデータの特性とアプリケーションの要件によって異なります。データベースを設計するときは、ニーズに基づいて適切なストレージ エンジンを選択する必要があります。MyISAM
Memory
-
InnoDB
: InnoDB は MySQL のデフォルトのストレージ エンジンです。コミット、ロールバック、およびクラッシュ回復機能を備えたトランザクションセーフ (ACID 準拠) テーブルを提供します。InnoDB は、行レベルのロック、外部キー制約、その他の機能もサポートしています。トランザクションの安全性機能と、大量のデータを処理する際の高いパフォーマンスにより、大規模なアプリケーションでよく使用されます。 -
MyISAM
: MyISAM は、MySQL の別のストレージ エンジンです。これは初期の ISAM コードに基づいた拡張機能であり、全文インデックス作成、圧縮、空間関数などの多数の機能を提供します。ただし、MyISAM はトランザクションおよび行レベルのロックをサポートせず、テーブル レベルのロックのみをサポートするため、データ セキュリティと同時実行性の点では InnoDB ほど優れていません。 -
Memory
: メモリ ストレージ エンジンによって作成されたテーブルはメモリ内にのみ存在します。つまり、MySQL サーバーがシャットダウンされると、テーブル内のデータは失われます。メモリ エンジンはディスク I/O を回避するため非常に高速ですが、サポートされるのは HASH インデックスのみです。このストレージ エンジンは、一時データの保存に非常に適しています。 -
NDB
(またはクラスターと呼ばれます): NDB は分散ストレージ エンジンであり、主に高可用性クラスター環境を作成するために使用されます。NDB はリアルタイム レプリケーションとデータの冗長ストレージをサポートしているため、高可用性と信頼性を実現できます。 -
Blackhole
: Blackhole ストレージ エンジンはデータを保存しませんが、すべての書き込み操作のログを記録します。このエンジンは、データをスレーブに複製するため、または監査のためによく使用されます。 -
Archive
: アーカイブ ストレージ エンジンは、大量のアーカイブ データの保存と取得に使用されます。圧縮には gzip アルゴリズムを使用し、ストレージ容量を節約します。ただし、Archive は INSERT および SELECT 操作のみをサポートし、DELETE および UPDATE 操作はサポートしません。
1. 基本的な紹介
ストレージエンジン | 機能説明 | 使用するシーン | アドバンテージ | 欠点がある |
---|---|---|---|---|
InnoDB | トランザクション、行レベルのロック、外部キー、クラッシュ後の安全なリカバリをサポートします。 | 電子商取引や銀行など、トランザクション処理が必要なシステムに適しています。 | コミット、ロールバック、およびクラッシュ回復機能があり、行レベルのロックをサポートし、同時実行パフォーマンスを向上させます。 | 占有されるディスク容量は比較的大きく、メモリ要件も大きくなります。 |
マイISAM | トランザクション処理、テーブルレベルのロック、全文検索、およびデータの圧縮機能はサポートされていません。 | ブログ、ニュース リリースなど、新しいレコードの読み取りまたは挿入のみを行うシステムに適しています。 | 占有するディスク容量とメモリが少なく、処理速度が速いです。 | トランザクション処理はサポートされていないため、データは簡単に失われます。 |
メモリ | すべてのデータはメモリに保存され、データ処理速度は高速ですが、MySQL の再起動後にデータが失われます。 | 一時的なデータの保存やキャッシュに適しています。 | データ処理が高速です。 | ストレージ容量は限られており、データは永続的ではありません。 |
アーカイブ | ログ情報などの大量のアーカイブ データの保存と取得に適しています。 | ログ情報などの大量のアーカイブ データに適しています。 | データ圧縮によりストレージ容量が節約されます。 | トランザクションはサポートされていません。挿入操作と選択操作のみがサポートされています。 |
ブラックホール | ブラックホールエンジンは、データを書き込むと消えるため、データベースをコピーするために使用できます。 | マスター/スレーブ レプリケーション中にのみ記録するのに適しています。 | 保管スペースをとりません。 | データは復元できません。 |
フェデレーテッド | ローカルのテーブルと同じようにリモートの MySQL テーブルにアクセスできる分散ストレージ エンジン。 | 分散データストレージに適しています。 | リモートデータにアクセスできます。 | ネットワークの遅延と安定性は、データ アクセスに影響を与える可能性があります。 |
CSV | CSV ストレージ エンジンでは、保存されたデータはテキスト形式で保存されます。 | データのインポートとエクスポートに適しています。 | データはテキストエディタで直接表示および編集できます。 | インデックスはサポートされていません。 |
NDB | MySQL クラスター ストレージ エンジンは、トランザクション ストレージ エンジンを提供します。 | 大規模なネットワーク アプリケーションに適しています。 | 大規模な同時処理をサポートします。 | 複雑な構成と管理。 |
2.1. InnoDB ストレージ エンジンの基礎原理
InnoDB は MySQL のデフォルトのストレージ エンジンであり、その基礎となる原則には主に次の側面が含まれます。
-
事务支持
: InnoDB はトランザクション モデルをサポートし、ACID
コミット (commit
)、ロールバック (rollback
)、リカバリ ( )recovery
などの機能を提供できます。InnoDB は、各トランザクションでトランザクション ログを使用して、トランザクション内のすべての変更を記録します。トランザクションが完了する前にデータベースがクラッシュした場合、InnoDB はトランザクション ログを使用してデータベースの状態を復元できます。 -
MVCC
: InnoDB はマルチバージョン同時実行制御 (MVCC
) を使用して同時トランザクションを管理します。MVCC を使用すると、操作をロックせずに複数の読み取り/書き込みトランザクションを同時に実行できるため、データベースの同時パフォーマンスが向上します。 -
行级锁定
MyISAM
: InnoDB は行レベルのロックをサポートしています。これは、などの他のストレージ エンジンと区別する重要な機能です。行レベルのロックにより、データベースの同時実行パフォーマンスが大幅に向上します。これは、データが変更されると、変更されたデータ行のみがロックされ、他のトランザクションは他の行に引き続きアクセスできるためです。 -
索引
: InnoDB ストレージ エンジンは、B+树
データ構造をインデックスとして使用します。特に、主キー インデックスは です聚簇索引
。これは、主キー インデックスのリーフ ノードが実際のデータ行であることを意味します。この設計により、主キーによるクエリは非常に高速になりますが、非主キー クエリでは、非主キー インデックスと主キー インデックスの 2 つのインデックス ルックアップが必要になります。 -
数据存储
: InnoDB はデータをテーブルスペースに保存します。テーブルスペースには複数のデータ ファイルを含めることができ、それらのデータ ファイルはディスク上の異なる場所に存在することができます。 -
内存缓存
: InnoDB には、テーブル データとインデックス データをキャッシュするためのバッファ プールが組み込まれています。これらのデータはアクセス時にバッファー プールにロードされるため、データベースのパフォーマンスが大幅に向上します。
InnoDB レコードのストレージ構造とインデックス ページの構造
InnoDB レコードのストレージ構造:
-
レコードヘッダー情報: 各レコードの前には、レコードの長さ、レコードが配置されている行が削除されているかどうかなど、現在のレコードの情報を含むいくつかの追加情報があります。
-
レコードデータ: テーブル内の行レコード、つまりユーザーの実際のデータを保存します。
-
末尾情報: 新しいフィールドの値のチェックサムなど、いくつかの検証情報が記録されます。
-
下一记录的指针:指向下一条记录。
-
上一记录的指针:指向上一条记录。
InnoDB索引页结构:
-
页面头部:存储了一些管理页面的信息,如页面类型,记录的数量,记录的地址等。
-
Infimum 和 Supremum 记录:Infimum 记录是页中记录的下限,Supremum 记录是页中记录的上限。
-
用户记录:保存的是表中的行记录,即用户实际的数据。
-
Free Space:空闲空间,用于存储新的记录。
-
页面目录:页目录保存了页中所有记录主键值的位置信息,用于加速表的查找。
-
页面尾部:保存了页的校验码。
.
3. MVCC 详解
MVCC(Multi-Version Concurrency Control)是MySQL中用于实现并发控制的机制。它通过为每个事务提供一个独立的数据版本来保证事务的隔离性和一致性。下面是MySQL MVCC的详细解释:
3.1. 版本号分配:
- 在每个数据行中,MySQL会为每个修改操作(插入、更新、删除)分配一个唯一的版本号或时间戳。
- 版本号可以是递增的事务ID或其他类型的时间戳。
3.2. 数据读取:
- 当事务开始时,会记录当前事务的开始时间戳或ID。
- 在读取数据时,MySQL只会向事务展示在其开始时间戳之前的数据版本。
- 这意味着事务不会读取到其他并发事务修改的数据。
3.3. 数据写入:
- 当事务对数据进行修改时,MySQL会生成一个新的数据版本并将其写入数据库。
- 新版本会被分配一个新的版本号或时间戳。
- 原始数据版本仍然存在,对于其他事务仍然可见。
3.4. 事务隔离级别:
- MVCC支持MySQL的多个事务隔离级别,如读未提交、读已提交、可重复读和串行化。
- 在不同的隔离级别下,MySQL的MVCC机制会根据需求来决定哪些数据版本对事务可见,以保证事务的隔离性和一致性。
3.5. 数据清理:
- 当事务完成后,MySQL会根据需要进行数据清理。
- 已提交的事务产生的旧数据版本将被清理,释放存储空间。
- 未提交的事务产生的数据版本仍然存在,直到事务提交或回滚。
MVCC机制使得不同的事务可以并发地读取和修改数据,而不会相互干扰或产生不一致的结果。它提供了更高的并发性和隔离性,减少了锁的竞争,提高了数据库的性能。然而,需要注意的是,MVCC机制会占用一定的存储空间来维护多个数据版本,因此在设计数据库时需要考虑存储需求。
MVCC 不是MySQL的特有机制,除了MySQL 使用了MVCC机制,其他数据库版本也使用了 以下是一些采用了多版本并发控制(MVCC)策略的数据库:
PostgreSQL:它使用 MVCC 提供多个并发用户间的一致性视图。
MySQL:在可重复读取隔离级别下,MySQL的InnoDB存储引擎利用 MVCC 解决读写冲突,提供快照数据而非最新数据。
Oracle:尽管Oracle使用了MVCC,但其实现方法与PostgreSQL和MySQL的InnoDB不同。在Oracle中,读操作不会阻塞写操作,反之亦然。
SQLite:SQLite使用了"snapshot isolation",它的核心概念与MVCC相似,都是在事务开始时提供一个快照,而非实时数据。
CouchDB 和 MongoDB:这两个NoSQL数据库也采用了MVCC或类似技术。
Apache HBase:作为开源的非关系型分布式数据库,HBase是Google BigTable的Java实现,也使用了MVCC。
Apache Cassandra:这是Facebook开发的一款开源分布式NoSQL数据库系统,用于满足高速读写需求,如Inbox搜索,它也实现了MVCC。
MariaDB: MySQL のオープン ソース ブランチ バージョンとして、MariaDB の InnoDB ストレージ エンジンも MVCC を使用します。
Microsoft SQL Server: SQL Server は、Read Committed Snapshot および Snapshot 分離レベルで MVCC を使用します。
Hyperledger Fabric: これは、MVCC を使用してトランザクションの競合を解決するオープンソースのブロックチェーン プラットフォームです。
Tarantool: オープン ソースの NoSQL データベースおよび Lua アプリケーション サーバーとして、Tarantool は MVCC を使用します。
Greenplum: PostgreSQL に基づいて開発された超並列処理データベース管理システムである Greenplum も MVCC を実装しています。
Firebird: Firebird は、多くの SQL 標準機能を提供するリレーショナル データベースとして、MVCC も実装しています。
SAP HANA: これは、MVCC も実装するメモリベースのリレーショナル データベース管理システムです。
参考文献
-
公式ドキュメント: MySQL の公式 Web サイトでは、InnoDB や MyISAM などのさまざまなストレージ エンジンに関する詳細なドキュメントが提供されています。https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html
-
書籍: 「High Performance MySQL」は、MySQL のパフォーマンスの最適化、アーキテクチャ設計、内部メカニズムに関する非常に包括的な書籍であり、ストレージ エンジンに関する多くの内容が含まれています。