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 リクエストの統合管理)

推薦する

検索履歴を実装するjQueryプラグイン

毎日jQueryプラグイン - 検索履歴を作成するためのものです。参考までに、具体的な内容は次のとお...

GZIP 圧縮 Tomcat と Web パフォーマンスの改善プロセス図

1. はじめに最近、あるプロジェクトに取り組んでいたのですが、サーバーからクライアントに返される J...

MySQL スロークエリ: スロークエリを有効にする

1. スロークエリの用途は何ですか? long_query_time を超えて実行されるすべての S...

要素タイムラインの実装

目次コンポーネント - タイムラインカスタムノードスタイルカスタムタイムスタンプコンポーネント - ...

HTML でのフォームとフォーム送信操作に関する情報のコレクション

ここでは、フォーム要素とフォーム送信に関する知識を紹介します。フォーム要素フォーム要素の DOM イ...

HTML で div を非表示にする テーブルを非表示にする TABLE または DIV コンテンツの CSS スタイル

今夜、数日間悩まされていた問題を解決しました。本当に解決したかどうかはわかりませんが、解決されている...

Firefox の CSS を使用してデータを盗む

0x00 はじめに数か月前、Firefox に脆弱性 (CVE-2019-17016) があること...

CSS3はさまざまな境界効果を実現します

半透明の境界線結果: 実装コード: <div> 半透明の境界線が見えますか? </...

MySQL インデックス最適化の説明

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

MySQLカスタム変数の概念と特徴

MySQL カスタム値は、値を保存するための一時的なコンテナです。サーバーへの接続がアクティブである...

docker run -v はデータボリュームを異常にマウントし、コンテナのステータスは常に再起動になります。

問題点: docker run に -v パラメータを追加すると、コンテナは常に再起動状態になります...

Vite2.x に基づく Vue 3.x プロジェクトの実装

Vue 3.x プロジェクトの作成 npm init @vitejs/app my-vue-app ...

MySQL ディープ ページング (数千万のデータを素早くページ分割する方法)

目次序文場合最適化まとめ序文バックエンド開発では、一度に大量のデータがロードされ、メモリやディスク ...

Centos7でmysql6の初期化インストールパスワードをインストールする方法

1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...

MySQL データベースの詳細な説明 (Ubuntu 14.0.4 LTS 64 ビットベース)

1. MySQLデータベースの構成と関連概念まず、MySQL はリレーショナル データベースである...