MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

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

MyISAM テーブルの REPAIR TABLE は、修復操作に myisamchk を使用することと似ており、同じパフォーマンス最適化の一部が適用されます。

次のオプションを使用して、そのメモリー割り当て変数を設定して、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 をグローバルに大きな値に設定すると、すべてのセッションに対してそれが実行され、多くの同時セッションのあるサーバーに過剰なメモリーが割り当てられるため、パフォーマンスが低下する可能性があります。