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

推薦する

MySqlデータベースの基礎知識のまとめ

目次基本的なデータベース操作2) データベースを表示する3) データベースを選択する4) データベー...

react+antdプロジェクトをゼロから構築する方法を教えます

これまでの記事はすべて私自身の学習記録であり、主に以前に遭遇した落とし穴を忘れないようにするためのも...

CentOS 7 パスワードを忘れた場合の解決プロセス図

必要Windows システムでも Linux システムでも、さまざまな理由でパスワードを忘れてしまう...

Linux プラットフォームの MySQL でリモート ログインを有効にする

開発中、MySQL へのリモートアクセスでよく問題に遭遇します。そのたびに検索する必要があり、面倒に...

vue3のテレポート瞬間移動機能の使い方を詳しく解説

vue3テレポート瞬間移動機能の使用は参考用です。具体的な内容は次のとおりです。テレポートは通常、瞬...

CSS で波の効果を作成するためのアイデア

以前、純粋な CSS を使用して波の効果を実現する方法をいくつか紹介しました。それらについては、次の...

mysql 解凍パッケージの基本インストールチュートリアル

新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...

Vue3とTypeScriptを組み合わせたプロジェクト開発の実践記録

目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...

HTML で水平ナビゲーション構造を設定する方法

この記事では、主にリスト構造を使用して水平ナビゲーション構造を設定する 2 つの方法を紹介します。こ...

1つの記事でTypeScriptのデータ型について学ぶ

目次基本タイプあらゆるタイプ配列タプルインタフェース関数自己推論を入力する結合タイプ(1つ以上選択)...

jQuery の CSS スタイル属性 css() と width() の完全ガイド

目次1. css() の基本的な使用法: 1.1 CSSプロパティを取得する1.2 CSSプロパティ...

CSS 複数 3 列適応レイアウト実装の詳細な説明

序文従来のWEBレイアウトに沿うため、すべてヘッダーとフッターモードの左・中央・右レイアウトで書かれ...

大きな MySQL テーブルに列を追加する方法

質問は https://www.zhihu.com/question/440231149 から参照さ...

Windows 10にWSL2 Ubuntu20.04をインストールしてdocker環境を構築する方法

WSLを有効にするシステムがWindows 10 2004以降であることを確認してください 「メニュ...

Docker コンテナにデプロイされた Django のタイムゾーンの問題

目次Django でのタイムゾーン設定USE_TZ=真USE_TZ=偽Linux コンテナでのタイム...