• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • REPAIR TABLE 语句(优化)

    REPAIR TABLE用于MyISAM表的操作类似于使用myisamchk进行修复操作,并且应用了一些相同的性能优化:

    • myisamchk具有控制内存分配的变量。您可以通过设置这些变量来提高性能,如“ 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_sizekey_buffer_size
    myisam_sort_buffer_sizemyisam_sort_buffer_size
    read_buffer_sizeread_buffer_size
    write_buffer_sizenull

    每个服务器系统变量都可以在运行时进行设置,其中一些(myisam_sort_buffer_sizeread_buffer_size)除具有全局值外,还具有会话值。设置会话值将限制更改对当前会话的影响,并且不会影响其他用户。更改全局唯一的变量(key_buffer_sizemyisam_max_sort_file_size)会影响其他用户也是如此。对于key_buffer_size,您必须考虑与这些用户共享缓冲区。例如,如果将myisamchkkey_buffer_size变量设置为128MB,则可以设置相应的key_buffer_size大于此值的系统变量(如果尚未将其设置得更大),以允许其他会话中的活动使用键缓冲区。但是,更改全局密钥缓冲区的大小会使缓冲区无效,从而导致磁盘I / O增大和其他会话的速度降低。避免此问题的另一种方法是使用单独的键高速缓存,将要修复的表中的索引分配给它,并在修复完成后将其释放。

    根据以上说明,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_sizeread_buffer_size全局设置为所有会话都使用较大的值,并且由于为具有多个同时会话的服务器分配过多的内存,可能会导致性能下降。