大量のデータを含むinnodbコンパクトテーブルに列を追加するのが遅い理由を誰かが説明できますか?
2 に答える
テーブルに列を追加するために使用ALTER TABLE
すると、テーブル全体を再構築する必要があります。これは、大きなテーブルの場合は時間がかかります。
の実行中にテーブルの使用を継続する場合はALTER
、pt-online-schema-changeツールの使用を検討する必要があります。
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
コンパクトテーブルのmysqlドキュメントから、各レコードのヘッダーには、フィールドがnullかどうかを示すビットが含まれていると記載されています。列を追加する場合は、そのヘッダーのサイズを変更する必要があります。これにより、少なくともそのテーブルのすべての行のサイズが変更されます。
抜粋:COMPACT行形式を使用するInnoDBテーブルの行には、次の特性があります。
各インデックスレコードには、可変長ヘッダーを前に付けることができる5バイトのヘッダーが含まれています。ヘッダーは、連続するレコードをリンクするため、および行レベルのロックで使用されます。
レコードヘッダーの可変長部分には、NULL列を示すためのビットベクトルが含まれています。NULLになる可能性のあるインデックスの列数がNの場合、ビットベクトルはCEILING(N / 8)バイトを占有します。(たとえば、NULLになる可能性のある9〜15列の列がある場合、ビットベクトルは2バイトを使用します。)