8.6.3 优化 REPAIR TABLE 语句

REPAIR TABLE用于MyISAMtable 类似于使用myisamchk进行修复操作,并且应用了一些相同的性能优化:

  • myisamchk具有控制内存分配的变量。您可以通过设置这些变量来提高其性能,如第 4.6.3.6 节“ myisamchk 内存使用情况”中所述。

  • 对于REPAIR TABLE,应用相同的原理,但是由于修复是由服务器完成的,因此您可以设置服务器系统变量而不是myisamchk变量。同样,除了设置内存分配变量之外,增加myisam_max_sort_file_size系统变量还增加了修复将使用较快的文件排序方法的可能性,并避免了通过键缓存方法进行较慢的修复。在检查以确保有足够的可用空间来保存 table 文件的副本之后,将变量设置为系统的最大文件大小。可用空间在包含原始 table 文件的文件系统中必须可用。

假设使用以下选项设置其内存分配变量来完成myisamchktable 修复操作:

--key_buffer_size=128M --myisam_sort_buffer_size=256M
--read_buffer_size=64M --write_buffer_size=64M

其中一些myisamchk变量对应于服务器系统变量:

myisamchk VariableSystem Variable
key_buffer_sizekey_buffer_size
myisam_sort_buffer_sizemyisam_sort_buffer_size
read_buffer_sizeread_buffer_size
write_buffer_sizenone

可以在运行时设置每个服务器系统变量,并且其中一些(myisam_sort_buffer_sizeread_buffer_size)除具有全局值外,还具有会话值。设置会话值将限制更改对当前会话的影响,并且不会影响其他用户。更改仅全局变量(key_buffer_sizemyisam_max_sort_file_size)也会影响其他用户。对于key_buffer_size,您必须考虑到缓冲区已与那些用户共享。例如,如果将myisamchk key_buffer_size变量设置为 128MB,则可以将相应的key_buffer_size系统变量设置为大于该变量(如果尚未设置较大),以允许其他会话中的活动使用键缓冲区。但是,更改全局密钥缓冲区的大小会使缓冲区无效,从而导致磁盘 I/O 增加和其他会话的速度降低。避免此问题的另一种方法是使用单独的键高速缓存,将要修复的 table 中的索引分配给它,并在修复完成后将其取消分配。参见第 8.10.2.2 节,“多键缓存”

根据以上说明,可以使用与myisamchk命令类似的设置来进行REPAIR TABLE操作。这里分配了一个单独的 128MB 密钥缓冲区,并且假定文件系统允许文件大小至少为 100GB。

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全局设置为较大的值会对所有会话这样做,并且由于具有多个同时进行的会话的服务器的过多内存分配,可能导致性能下降。