Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Optimizing REPAIR TABLE Statements

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_sizeread_buffer_size)还具有会话值,设置会话值将限制更改的影响仅限于当前会话,不影响其他用户。改变全局变量(如key_buffer_sizemyisam_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设置为大值将对所有会话产生影响,并且可能会由于服务器具有许多同时会话而导致性能下降。