物理的に言えば、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 です。もちろん、このサイズには、このテーブルのすべてのインデックスとその他の関連データが含まれます。 個別テーブルスペースストレージを使用する場合、各テーブルのデータは別々のファイルに保存されます。このとき、単一テーブルの制限はファイルシステムのサイズ制限になります。 以下は、さまざまなプラットフォーム上の個々の表領域ファイルの最大サイズです。
※以下はMySQLのドキュメントより抜粋です。 Windows ユーザーへの注意: FAT および VFAT (FAT32) は、MySQL の運用には適していません。 NTFSを使用する必要があります。 (4)共有表領域と排他表領域 共有表領域と排他表領域は、データが格納される方法を指します。 共有テーブルスペース: データベースのすべてのテーブル データとインデックス ファイルは 1 つのファイルに配置されます。この共有テーブルスペースのデフォルトのファイル パスは、データ ディレクトリにあります。 デフォルトのファイル名は ibdata1 で、10M に初期化されます。 排他的テーブルスペース: 各テーブルは独立したファイル (単一テーブルのデータ コンテンツとインデックス コンテンツを含む .ibd ファイル) に生成され、保存されます。 1) ストレージコンテンツの比較 排他テーブルスペースを使用した後: 各テーブルに対応するデータ、インデックス、挿入バッファは、専用のテーブルスペース(.idbファイル)に保存されます。 各テーブルに対応するUNDO情報、システムトランザクション情報、セカンダリ書き込みバッファなどは、元の共有テーブルスペース(ibdata1ファイル)に引き続き保存されます。 2) 機能の比較 共有表領域と独立表領域の具体的な利点と欠点は次のとおりです。 共有表領域: アドバンテージ: テーブルスペースは複数のファイルに分割され、異なるディスクに保存できます (テーブルスペース ファイルのサイズはテーブルのサイズによって制限されません。たとえば、テーブルを異なるファイルに分散できます)。 データとファイルはまとめて管理しやすくなっています。 欠点: すべてのデータとインデックスを 1 つのファイルに格納すると、非常に大きなファイルになります。大きなファイルは複数の小さなファイルに分割できますが、複数のテーブルとインデックスが混在してテーブルスペースに格納されます。このように、テーブルに対して大量の削除操作を実行すると、テーブルスペースに大量のギャップが発生します。特に、統計分析やロギング システムなどのアプリケーションでは、共有テーブル スペースを使用することは最も適していません。 独立したテーブルスペース: (設定ファイル (my.cnf) で innodb_file_per_table を設定) アドバンテージ:
独立した表領域を使用するテーブルの場合、どのように削除しても、表領域の断片化がパフォーマンスにそれほど深刻な影響を与えることはなく、対処する機会がまだあります。 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 はディレクトリを作成しないので、サーバーを起動する前に設定されたパス ディレクトリが存在することを確認してください。 データを移行およびバックアップするときは、データ ファイルの整合性に注意してください。 以下もご興味があるかもしれません:
|
<<: VirtualBox で作成された Debian 仮想マシンは Windows ホストとファイルを共有します
>>: Vue プロジェクトで axios をカプセル化する方法 (http リクエストの統合管理)
Mysql で特定のフィールドからスペースを一括削除する方法はありますか?文字列の前後のスペースだけ...
Laravel 5.4 のデフォルトの utf8mb64 文字エンコーディングをサポートするには、M...
背景最近、Docker 初心者の友人から、毎回プロジェクト構成ファイルにハードコーディングしてサービ...
今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...
目次古典的なアプローチ質問その他の質問注意が必要な問題古典的なアプローチご存知のとおり、アカウントの...
MySQLデータベースのインストールに関するメモ、みんなで共有a) MySQL ソースインストールパ...
最近、開発プロセス中に、プロジェクト開発環境に接続されている MySQL データベースは Aliba...
背景すべては、WeChat 技術グループのクラスメートが「写真の主な色を取得する方法はあるか」と尋ね...
JS アニメーションの代わりに CSS アニメーションを使用する必要があるのはなぜですか? Java...
1. ROW_NUMBER()定義: ROW_NUMBER() 関数は、select によってクエリ...
導入前回の記事では、axios のシンプルなカプセル化と、axios インターセプターの適用シナリオ...
この記事では、MySQL マスターとスレーブ データ間の不一致の解決方法と、プロンプト「Slave_...
勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...
序文これは fastdfs を使用してイントラネット外部に展開された分散ファイルシステムであるためで...
コードをコピーコードは次のとおりです。 <div スタイル="幅:630px;高さ:...