8.6.3 优化 REPAIR TABLE 语句
REPAIR TABLE用于MyISAM
table 类似于使用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 Variable | System Variable |
---|---|
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
变量设置为 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全局设置为较大的值会对所有会话这样做,并且由于具有多个同时进行的会话的服务器的过多内存分配,可能导致性能下降。