MySQL の InnoDB ストレージ ファイルの詳細な説明

MySQL の InnoDB ストレージ ファイルの詳細な説明

物理的に言えば、InnoDB テーブルは、共有テーブルスペース ファイル (ibdata1)、排他テーブルスペース ファイル (ibd)、テーブル構造ファイル (.frm)、およびログ ファイル (REDO ファイルなど) で構成されます。

1. テーブル構造ファイル

MYSQL でデータ テーブルを作成すると、そのデータ ディレクトリに対応するデータベース ディレクトリに、対応するテーブルの .frm ファイルが作成されます。.frm ファイルは、テーブル構造の定義など、各データ テーブルのメタデータ (メタ) 情報を保存するために使用されます。.frm ファイルはデータベース ストレージ エンジンとは関係ありません。つまり、ストレージ エンジンのすべてのデータ テーブルには、user.frm など、データ テーブル名 .frm という名前の .frm ファイルが必要です。.frm ファイルを使用すると、データベースがクラッシュしたときにテーブル構造を復元できます。

2. テーブルスペースファイル

(1)表スペース構造分析

以下は InnoDB のテーブルスペース構造図です。

データ セグメントは B+ ツリーのリーフ ノードであり、インデックス セグメントは B+ ツリーの非リーフ ノードです。InnoDB ストレージ エンジンの管理はエンジン自体によって完了し、テーブルスペースは散在するセグメントで構成されます。セグメントには複数のエクステントが含まれます。

エクステントは 64 の連続したページで構成され、各ページのサイズは 16K です。つまり、各エクステントのサイズは 1MB です。新しいテーブルを作成すると、最初に 32 ページのフラグメントを使用してデータを格納し、データが使い果たされた後にエクステントが適用されます (InnoDB は、データのシーケンシャル パフォーマンスを確保するために、一度に最大 4 つのエクステントを適用します)。
ページ タイプは、データ ページ、元に戻すページ、システム ページ、トランザクション データ ページ、挿入バッファー ビットマップ ページ、および挿入バッファー空きリスト ページです。

(2)排他テーブルスペースファイル

innodb_file_per_table がオンに設定されている場合、システムは各テーブルに対して table_name.ibd ファイルを生成します。このファイルには、テーブルに関連するデータ、インデックス、および内部データ ディクショナリ情報が格納されます。

(3)共有テーブルスペースファイル

InnoDB ストレージ エンジンでは、デフォルトのテーブルスペース ファイルは ibdata1 (主に共有テーブルスペース データを格納) であり、次の図に示すように 10M に初期化され、拡張できます。

実際、InnoDB テーブルスペース ファイルは次のステートメントを使用して変更できます。

Innodb_data_file_path=ibdata1:370M;ibdata2:50M:自動拡張

共有テーブルスペース ストレージ方式を使用する場合、すべての Innodb データは、多数のファイルで構成できる個別のテーブルスペースに保存されます。テーブルは複数のファイルにまたがって存在できるため、テーブルのサイズ制限はファイル サイズの制限ではなく、テーブル自体の制限になります。 Innodb の公式ドキュメントによると、テーブルスペースの最大制限は 64 TB です。つまり、Innodb の単一テーブルの制限は基本的に約 64 TB です。もちろん、このサイズには、このテーブルのすべてのインデックスとその他の関連データが含まれます。

個別テーブルスペースストレージを使用する場合、各テーブルのデータは別々のファイルに保存されます。このとき、単一テーブルの制限はファイルシステムのサイズ制限になります。

以下は、さまざまなプラットフォーム上の個々の表領域ファイルの最大サイズです。

オペレーティング システムのファイル サイズ制限
Win32 (FAT/FAT32 2GB/4GB 付き)
Win32、NTFS 2TB(さらに大きい可能性あり)
Linux 2.4+ (ext3 ファイルシステムを使用) 4TB
Solaris 9/10 16TB
MacOS X (HFS+ 2TB 搭載)
NetWare (NSS ファイル システム 8TB)

※以下はMySQLのドキュメントより抜粋です。

Windows ユーザーへの注意: FAT および VFAT (FAT32) は、MySQL の運用には適していません。 NTFSを使用する必要があります。

(4)共有表領域と排他表領域

共有表領域と排他表領域は、データが格納される方法を指します。

共有テーブルスペース: データベースのすべてのテーブル データとインデックス ファイルは 1 つのファイルに配置されます。この共有テーブルスペースのデフォルトのファイル パスは、データ ディレクトリにあります。 デフォルトのファイル名は ibdata1 で、10M に初期化されます。

排他的テーブルスペース: 各テーブルは独立したファイル (単一テーブルのデータ コンテンツとインデックス コンテンツを含む .ibd ファイル) に生成され、保存されます。

1) ストレージコンテンツの比較

排他テーブルスペースを使用した後:

各テーブルに対応するデータ、インデックス、挿入バッファは、専用のテーブルスペース(.idbファイル)に保存されます。

各テーブルに対応するUNDO情報、システムトランザクション情報、セカンダリ書き込みバッファなどは、元の共有テーブルスペース(ibdata1ファイル)に引き続き保存されます。

2) 機能の比較

共有表領域と独立表領域の具体的な利点と欠点は次のとおりです。

共有表領域:

アドバンテージ:

テーブルスペースは複数のファイルに分割され、異なるディスクに保存できます (テーブルスペース ファイルのサイズはテーブルのサイズによって制限されません。たとえば、テーブルを異なるファイルに分散できます)。

データとファイルはまとめて管理しやすくなっています。

欠点:

すべてのデータとインデックスを 1 つのファイルに格納すると、非常に大きなファイルになります。大きなファイルは複数の小さなファイルに分割できますが、複数のテーブルとインデックスが混在してテーブルスペースに格納されます。このように、テーブルに対して大量の削除操作を実行すると、テーブルスペースに大量のギャップが発生します。特に、統計分析やロギング システムなどのアプリケーションでは、共有テーブル スペースを使用することは最も適していません。

独立したテーブルスペース: (設定ファイル (my.cnf) で innodb_file_per_table を設定)

アドバンテージ:

  1. 各テーブルには独自のテーブルスペースがあります。
  2. 各テーブルのデータとインデックスは、独自のテーブルスペースに保存されます。
  3. 単一のテーブルを異なるデータベース間で移動できます。
  4. スペースはリサイクルできる

独立した表領域を使用するテーブルの場合、どのように削除しても、表領域の断片化がパフォーマンスにそれほど深刻な影響を与えることはなく、対処する機会がまだあります。

a) テーブル削除操作によりテーブルスペースが自動的に再利用される

b) 統計分析テーブルや日次値テーブルの場合は、大量のデータを削除した後、alter table TableName engine=innodb; を実行して未使用領域を縮小できます。

c) innodb-plugin を使用する Innodb の場合、truncate table を使用するとスペースも縮小されます。

5. サーバー リソースが限られており、単一のテーブル内のデータがそれほど大きくない場合は、独立したテーブルスペースの方が共有テーブルスペースよりも明らかに効率的です。ただし、MySQL はデフォルトで共有テーブルスペースを使用します。

欠点:

1 つのテーブルのサイズが 100 GB を超えるなど、大きすぎる可能性があります。

3) 共有表領域と排他表領域間の変換

排他的な空のテーブルスペース構成を変更し、次のパラメータを設定します。

innodb_data_home_dir = "/user/local/mysql/var" データベースファイルが保存されるディレクトリ

innodb_log_group_home_dir = "/user/local/mysql/var" ログ保存ディレクトリ

innodb_data_file_path=ibdata1:10M:autoextend は、拡張可能なサイズが 10 MB の ibdata1 という名前の別のファイル (共有データ ファイル) を設定します。ファイルの場所は指定されていないため、デフォルトでは MySQL データ ディレクトリ内になります。

innodb_file_per_table=1 共有テーブルスペースを使用するか、排他テーブルスペースを使用するか (1: 排他テーブルスペースを使用する、0: 共有テーブルスペースを使用する)

innodb_file_per_table 変数を確認します。OFF の場合は、共有テーブルスペースが使用されていることを意味します (デフォルトでは、使用されるテーブルスペースは共有テーブルスペースです)。

innodb_file_per_table が変更されても、手動で変更しない限り、以前使用された共有テーブルスペースには影響しません。

知らせ:

InnoDB はディレクトリを作成しないので、サーバーを起動する前に設定されたパス ディレクトリが存在することを確認してください。

データを移行およびバックアップするときは、データ ファイルの整合性に注意してください。

以下もご興味があるかもしれません:
  • InnoDB タイプの MySql によるテーブル構造とデータの復元
  • MySQL の起動時に InnoDB エンジンが無効になる問題の解決方法
  • mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション
  • MySQL innodb例外の修復に関する経験の共有
  • MySQL InnoDB 監視 (システム層、データベース層)
  • MySQLでMyISAMストレージエンジンをInnodbに変更した操作記録のまとめ
  • MySQL innodb_autoinc_lock_mode について
  • MySQL の最適化: InnoDB の最適化
  • MySQLストレージエンジンのMyISAMとInnoDBの違いを詳しく説明
  • MySQL は InnoDB 機能が無効になっているため、InnoDB を有効にする必要があるというメッセージを表示します。解決策
  • Innodb トランザクション分離レベルと MySQL のロックの関係に関するチュートリアル

<<:  VirtualBox で作成された Debian 仮想マシンは Windows ホストとファイルを共有します

>>:  Vue プロジェクトで axios をカプセル化する方法 (http リクエストの統合管理)

推薦する

Docker Composeを使用してDOCleverをインストールする詳細なプロセスを説明します

目次1. Docker Composeとは何か、インストールして使用する方法2. DOCleverと...

Vue シングルページ SEO の 4 つのソリューションについての簡単な説明

目次1.Nuxtサーバーサイドレンダリングアプリケーションの展開(SSRサーバーレンダリング)利点:...

clearfixとclearの例

この記事では、CSS を理解し始めたばかりの人を対象に、主に HTML で clearfix と c...

CSS の無効な行の高さ設定の問題の解決策

CSS の無効な行の高さ設定についてまず、次のコード文字列を記述します。 <!DOCTYPE ...

MySQL トランザクション、分離レベル、ロックの使用例の分析

この記事では、例を使用して、MySQL トランザクション、分離レベル、およびロックの使用について説明...

DockerはCMDまたはENTRYPOINTコマンドを使用して複数のサービスを同時に起動します

要件: Celery は Django に導入されています。Django プロジェクトを開始するとき...

主軸上のFlex子要素の比率を制御する方法

背景フレックス レイアウトにより、配置とスペースの割り当てがより効果的に実現されます。最近、flex...

Ubuntuの基本設定: openssh-serverのインストールと使用

Ubuntu 17.10 での openssh-server のインストールと使用を記録します。イン...

element-ui 写真をアップロードした後、座標点をマークします

要素UIとはelement-ui は、Ele.me のフロントエンド チームが開発者、デザイナー、製...

HTMLベースの複数画像アップロードのプレビュー機能を実装

最近、Web ページに複数の画像をアップロードするためのスクリプトを作成しました。これは非常に実用的...

Canonical が Flutter で Linux デスクトップ アプリを有効化 (推奨)

Google の Flutter の目標は、どのプラットフォームを使用していても、ネイティブの速度...

Linuxコマンドとファイル検索の詳しい説明

1. ファイル名検索を実行するwhich ('実行可能ファイル' を検索) //PA...

Linux での MySQL のインストールに関する詳細なチュートリアル

1. MySQLサービスをシャットダウンする# service mysqld stop 2. rpm...

スライド効果を実現するためのネイティブJavaScript

ページ、特にホームページを作成するときは、通常、Web サイト全体の他のメイン ページにリンクできる...

Docker コンテナで ASP.NET Core を実行する手順

最近は学ぶべき知識が多すぎて、どれを先に学べばいいのかわかりません。このブログはもともとxamari...