文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9MB
PDF (A4) - 40.0MB
手册页 (TGZ) - 258.5KB
手册页 (Zip) - 365.5KB
信息 (Gzip) - 4.0MB
信息 (Zip) - 4.0MB


MySQL 8.4 参考手册  /  ...  /  优化 REPAIR TABLE 语句

10.6.3 优化 REPAIR TABLE 语句

用于 MyISAM 表的 REPAIR TABLE 语句类似于使用 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 变量 系统变量
key_buffer_size key_buffer_size
myisam_sort_buffer_size myisam_sort_buffer_size
read_buffer_size read_buffer_size
write_buffer_size

每个服务器系统变量都可以在运行时设置,其中一些变量(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;

例如

[mysqld]
myisam_sort_buffer_size=256M
key_buffer_size=1G
myisam_max_sort_file_size=100G

如果您希望在默认情况下生效,则可以在服务器启动时全局设置影响 REPAIR TABLE 的系统变量。例如,将以下行添加到服务器 my.cnf 文件中


这些设置不包括 read_buffer_size。将 read_buffer_size 全局设置为较大的值会对所有会话执行此操作,并且由于为具有许多并发会话的服务器分配了过多的内存,可能会导致性能下降。