10.6.3 优化修复表语句
REPAIR TABLE
for MyISAM
表是类似使用myisamchk进行修复操作,并且一些相同的性能优化适用:
-
myisamchk有控制内存分配的变量,您可能可以通过设置这些变量来提高性能,详见第6.6.4.6节,“myisamchk 内存使用”。
-
对于
REPAIR TABLE
,同样适用,但是因为修复是由服务器执行的,因此您需要设置服务器系统变量,而不是myisamchk变量。此外,在设置内存分配变量外,还可以增加myisam_max_sort_file_size
系统变量,这样修复操作更有可能使用快速的文件排序方法,而不是更慢的修复方法。将变量设置为您的系统中最大文件大小,确保有足够的可用空间来保存表文件的副本。可用空间必须在包含原始表文件的文件系统中。
假设myisamchk表修复操作使用以下选项来设置内存分配变量:
--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和性能下降。一个避免这个问题的方法是使用单独的键缓存,分配给该缓存要修复的表的索引,并在修复完成后释放它。见第10.10.2.2节,“多个键缓存”。
根据前面的评论,可以使用REPAIR TABLE
操作来使用类似于myisamchk命令的设置。这里分配了一个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
设置为大值将对所有会话产生影响,并且可能会由于服务器具有许多同时会话而导致性能下降。