なぜinnodb_file_per_tableを使用するのですか?
ファイルレベルで実行できるため、個々の管理が簡単だからです。つまり、サーバーがダウンしている場合でも、テーブルファイルをコピーすることでデータをコピーできますが、共有テーブルスペースを使用すると、不必要に大量になる可能性のあるものすべてをコピーするか、サーバーを実行してデータを抽出する方法を見つけることを意味します(あなたは本当に16進エディタで手動でデータを抽出したくありません)。
.ibd
あるサーバーから別のサーバーにファイルを単純にコピーして貼り付けることはできないと誰かが警告しました。これは真実かもしれませんが、同じサーバー上のバックアップには適用すべきではありません(ここでは、コピーを作成するという従来の意味でバックアップという用語を使用しています。さらに、ほとんどの「テーブルごとのファイルへの変換」ガイドibdata1
の削除ibdata1
手順で見られるように、起動時に自動的に再作成されます。そのため、ファイル(および対応するなどのファイル)に加えてコピーする必要はありません。ibdata1
.ibd
.frm
失われたテーブルを回復しようとする場合、そのコピーするのに十分であるべき.ibd
と.frm
ファイルを、だけでなく、information_schema
(これはずっとより小さいibdata1
)。そうすれば、それらをダミーサーバーに入れて、大規模なもの全体をコピーすることなくテーブルを抽出できます。
ただし、パフォーマンスを向上させるという主張には疑問があります。…innodb_file_per_tableでは、より多くのディスクI / O操作が必要です。これは、複雑なJOINと外部キー制約で重要です。
当然のことながら、パフォーマンスは使用中の特定のデータベースに完全に依存します。ある人は、別の人とは(非常に)異なる結果になります。
file-per-tableではより多くのディスクI / O操作があることは事実ですが、ほんの少しだけです。システムの仕組みを考えてください。
モノリシックデータベースの場合:
- サーバーが起動しました
ibdata1
開かれている
- ヘッダーとメタデータが読み込まれます
- 構造とメタデータはメモリにキャッシュされます
- クエリが発生します
- サーバーはディスクにアクセスし、既に開いているデータを読み取ります
ibdata1
- サーバーはデータをメモリにキャッシュする場合があります
テーブルごとのデータベースの場合:
- サーバーが起動しました
ibdata1
開かれている
- ヘッダーとメタデータが読み込まれます
- 個々の
.ibd
ファイルが開かれます
- ヘッダーとメタデータは各
.ibd
ファイルから読み取られます
- 構造とメタデータはメモリにキャッシュされます
- クエリが発生します
- サーバーはディスクにアクセスし、既に開いている
.ibd
ファイルからデータを読み取ります
- サーバーはデータをメモリにキャッシュする場合があります
サーバーの実行中は、サーバーが開いているハンドルがあるため、データファイルを移動できません。これは、起動時にそれらを開き、開いたままにするためです。個々のクエリごとに開いたり閉じたりすることはありません。
そのため、サーバーの起動時に最初に行われるI / O操作はいくつかあります。実行中ではありません。さらに、個々の.ibd
ファイルには独自のオーバーヘッド(ファイルシグネチャ、構造など)がありますが、メモリにキャッシュされ、クエリごとに再読み取りされることはありません。さらに、共有テーブルスペースでも同じ構造が読み取られるため、必要なメモリはほとんどありません(もしあれば)。
innodb_file_per_tableはmysqlのパフォーマンス向上に影響しますか?
実際には、どちらかといえば、実際にはパフォーマンスが悪化する可能性があります。
共有テーブルスペースを使用する場合、サーバーが複数のテーブルからデータの見本を一度に読み取るように、読み取り操作と書き込み操作を組み合わせることができますibdata
。
ただし、データが複数のファイルに分散している場合は、ファイルごとに個別のI / O操作を個別に実行する必要があります。
もちろん、これも問題のデータベースに完全に依存しています。実際のパフォーマンスへの影響は、サイズ、クエリの頻度、および共有テーブルスペースの内部断片化に依存します。大きな違いに気付く人もいれば、まったく影響を感じない人もいます。
テーブルスペースは単一のibdataで共有されます。別々のテーブル専用のテーブルスペースがディスクスペースを節約する方法は?
ありません。どちらかといえば、それはディスク使用量をいくらか増やします。
テストする60GBのデータベースはありませんが、WordPressのインストールと、個人使用および開発テスト用のいくつかの小さなテーブルを含む「控えめな」個人データベースは、共有テーブルスペースを使用している間、約30MBの重さでした。file-per-tableに変換した後、最大85MBに膨れ上がりました。すべてをドロップして再インポートしても、依然として60 MBを超えていました。
この増加は、次の2つの要因によるものです。
の絶対最小サイズibdata1
は、なんらかの理由で、information_schema
格納する以外に何もない場合でも10MBです。
共有テーブルスペースでは、ibdata1
ファイル署名、メタデータなどのオーバーヘッドのみがありますが、テーブルごとに、個々の.ibd
ファイルにはすべてがあります。これは、合計が(仮に<10MBであってもibdata1
)少なくとも次の値だけ大きくなることを意味します
GetTotalSizeofOverhead() * GetNumTables()
明らかに、これらは大幅に増加することはありません(データベースサイズを制限するホストを使用したり、フラッシュドライブに保存したりする場合を除きます)が、それでも増加している一方で、(すべての)テーブルをファイルに切り替えることで-テーブルごとibdata1
に10MBまで縮小できますが、全体の合計は常にそれよりも大きくなります。