Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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

10.6.3 REPAIR TABLE 语句优化

REPAIR TABLE 对于 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,您需要考虑缓冲区是与其他用户共享的。如果您将 myisamchkkey_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 到一个大值将对所有会话产生影响,并可能由于服务器上许多同时会话的过度内存分配而导致性能下降。