MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  REPAIR TABLE ステートメントの最適化

8.6.3 REPAIR TABLE ステートメントの最適化

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_sizeread_buffer_size) にはグローバル値に加えてセッション値もあります。 セッション値を設定することで、現在のセッションへの変更の影響を制限し、ほかのユーザーに影響しません。 グローバルのみの変数 (key_buffer_sizemyisam_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 をグローバルに大きな値に設定すると、すべてのセッションに対してそれが実行され、多くの同時セッションのあるサーバーに過剰なメモリーが割り当てられるため、パフォーマンスが低下する可能性があります。


関連キーワード:  size, buffer, テーブル, 変数, インデックス, InnoDB, sort, 設定, ステートメント, REPAIR