### 8.6.3 优化 REPAIR TABLE 语句

[](<>)

[`维修台`](repair-table.html)为了`MyISAM`表类似于使用[**迈萨姆奇克**](myisamchk.html)对于修复操作，一些相同的性能优化适用：

-   [**迈萨姆奇克**](myisamchk.html)具有控制内存分配的变量。您可以通过设置这些变量来提高性能，如中所述[第 4.6.4.6 节，“myisamchk 内存使用”](myisamchk-memory.html).

-   为了[`维修台`](repair-table.html)，同样的原则也适用，但是因为修复是由服务器完成的，所以你设置服务器系统变量而不是[**迈萨姆奇克**](myisamchk.html)变量。此外，除了设置内存分配变量，增加[`myisam_max_sort_file_size`](server-system-variables.html#sysvar_myisam_max_sort_file_size)系统变量增加了修复使用更快的文件排序方法的可能性，并避免了通过密钥缓存方法进行的较慢修复。在检查以确保有足够的可用空间来保存表文件的副本之后，将变量设置为系统的最大文件大小。包含原始表文件的文件系统中必须有可用空间。

    假设一个[**迈萨姆奇克**](myisamchk.html)表修复操作使用以下选项来设置其内存分配变量：


```
--key_buffer_size=128M --myisam_sort_buffer_size=256M
--read_buffer_size=64M --write_buffer_size=64M
```

其中一些[**迈萨姆奇克**](myisamchk.html)变量对应于服务器系统变量：

| [**迈萨姆奇克**](myisamchk.html)多变的 | 系统变量 |
| ------------------------------ | ---- |
| `key_buffer_size` | [`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size) |
| `myisam_sort_buffer_size` | [`myisam_sort_buffer_size`](server-system-variables.html#sysvar_myisam_sort_buffer_size) |
| `读取缓冲区大小` | [`读取缓冲区大小`](server-system-variables.html#sysvar_read_buffer_size) |
| `write_buffer_size` | 没有 |

每个服务器系统变量都可以在运行时设置，其中一些（[`myisam_sort_buffer_size`](server-system-variables.html#sysvar_myisam_sort_buffer_size),[`读取缓冲区大小`](server-system-variables.html#sysvar_read_buffer_size)) 除了全局值之外，还有一个会话值。设置会话值会限制更改对您当前会话的影响，并且不会影响其他用户。更改全局变量 ([`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size),[`myisam_max_sort_file_size`](server-system-variables.html#sysvar_myisam_max_sort_file_size)) 也会影响其他用户。为了[`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size)，您必须考虑到缓冲区是与这些用户共享的。例如，如果您设置[**迈萨姆奇克**](myisamchk.html) `key_buffer_size`变量为128MB，你可以设置相应的[`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size)大于该值的系统变量（如果尚未设置为更大），以允许其他会话中的活动使用密钥缓冲区。但是，更改全局键缓冲区大小会使缓冲区无效，从而导致磁盘 I/O 增加和其他会话变慢。避免此问题的另一种方法是使用单独的键缓存，将要修复的表中的索引分配给它，并在修复完成时释放它。看[第 8.10.2.2 节，“多键缓存”](multiple-key-caches.html).

基于前面的评论，一个[`维修台`](repair-table.html)操作可以如下进行，以使用类似的设置[**迈萨姆奇克**](myisamchk.html)命令。这里分配了一个单独的 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.html)操作以最小化影响其他用户，将其值保存在用户变量中并在之后恢复它。例如：

```
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.html)如果您希望这些值默认生效，可以在服务器启动时全局设置。例如，将这些行添加到服务器`我的.cnf`文件：

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

这些设置不包括[`读取缓冲区大小`](server-system-variables.html#sysvar_read_buffer_size).环境[`读取缓冲区大小`](server-system-variables.html#sysvar_read_buffer_size)全局设置为一个较大的值会针对所有会话执行此操作，并且可能会由于为具有许多同时会话的服务器分配过多的内存而导致性能下降。
