MyISAM
テーブルの REPAIR TABLE
は、修復操作に myisamchk を使用することと似ており、同じパフォーマンス最適化の一部が適用されます。
myisamchk にはメモリー割り当てを制御する変数があります。 セクション4.6.4.6「myisamchk メモリー使用量」に説明するように、これらの変数を設定してパフォーマンスを向上できることがあります。
REPAIR TABLE
では、同じ原則が適用されますが、修復はサーバーによって実行されるため、myisamchk 変数の代わりに、サーバーシステム変数を設定します。 また、メモリー割り当て変数の設定に加えて、myisam_max_sort_file_size
システム変数を増やすと、修復でより高速な filesort 方式が使用される可能性が高くなり、キーキャッシュ方式によるより遅い修復が回避されます。 テーブルファイルのコピーを保持できるだけの十分な空き領域があることを確認したら、システムの最大ファイルサイズに変数を設定します。 元のテーブルファイルを格納しているファイルシステムで、空き領域が使用できる必要があります。
次のオプションを使用して、そのメモリー割り当て変数を設定して、myisamchk テーブル修復操作が実行されたとします。
--key_buffer_size=128M --myisam_sort_buffer_size=256M
--read_buffer_size=64M --write_buffer_size=64M
それらの myisamchk 変数の一部はサーバーシステム変数に対応します。
myisamchk 変数 | システム変数 |
---|---|
key_buffer_size |
key_buffer_size |
myisam_sort_buffer_size |
myisam_sort_buffer_size |
read_buffer_size |
read_buffer_size |
write_buffer_size |
none |
各サーバーシステム変数は実行時に設定でき、それらの一部 (myisam_sort_buffer_size
、read_buffer_size
) にはグローバル値に加えてセッション値もあります。 セッション値を設定することで、現在のセッションへの変更の影響を制限し、ほかのユーザーに影響しません。 グローバルのみの変数 (key_buffer_size
、myisam_max_sort_file_size
) を変更すると、ほかのユーザーにも影響します。 key_buffer_size
の場合、バッファーがそれらのユーザーと共有されることを考慮しておく必要があります。 たとえば、myisamchk key_buffer_size
変数を 128M バイトに設定した場合、対応する key_buffer_size
システム変数をそれより大きく設定し (それがすでに大きく設定されていない場合)、ほかのセッションのアクティビティーによるキーバッファーの使用を許可できます。 ただし、グローバルキーバッファーサイズを変更すると、バッファーが無効になり、ディスク I/O が増加して、ほかのセッションが遅くなります。 この問題を回避する代替策は、個別のキーキャッシュを使用し、それを修復対象のテーブルのインデックスに割り当て、修復が完了したら、その割り当てを解除することです。 セクション8.10.2.2「複合キーキャッシュ」を参照してください。
先述の説明に基づいて、REPAIR TABLE
操作は、次のように実行して、myisamchk コマンドに似た設定を使用できます。 ここでは、個別の 128M バイトのキーバッファーが割り当てられ、ファイルシステムは 100G バイト以上のファイルサイズを許可するものとします。
SET SESSION myisam_sort_buffer_size = 256*1024*1024;
SET SESSION read_buffer_size = 64*1024*1024;
SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;
SET GLOBAL repair_cache.key_buffer_size = 128*1024*1024;
CACHE INDEX tbl_name IN repair_cache;
LOAD INDEX INTO CACHE tbl_name;
REPAIR TABLE tbl_name ;
SET GLOBAL repair_cache.key_buffer_size = 0;
グローバル変数を変更するが、ほかのユーザーへの影響を最小にするため、REPAIR TABLE
操作の間にのみ実行するようにしたい場合、その値をユーザー変数に保存して、あとでそれをリストアします。 例:
SET @old_myisam_sort_buffer_size = @@GLOBAL.myisam_max_sort_file_size;
SET GLOBAL myisam_max_sort_file_size = 100*1024*1024*1024;
REPAIR TABLE tbl_name ;
SET GLOBAL myisam_max_sort_file_size = @old_myisam_max_sort_file_size;
REPAIR TABLE
に影響するシステム変数は、変数をデフォルトで有効にしたい場合、サーバーの起動時にグローバルに設定できます。 たとえば、次の行をサーバーの my.cnf
ファイルに追加します。
[mysqld]
myisam_sort_buffer_size=256M
key_buffer_size=1G
myisam_max_sort_file_size=100G
これらの設定には read_buffer_size
は含まれません。 read_buffer_size
をグローバルに大きな値に設定すると、すべてのセッションに対してそれが実行され、多くの同時セッションのあるサーバーに過剰なメモリーが割り当てられるため、パフォーマンスが低下する可能性があります。