Spec-Zone.ru › MySQL 5.7

8.6.3 Оптимизация операторов REPAIR TABLE

REPAIR TABLE для MyISAM таблиц похожа на использование myisamchk для операций ремонта, и некоторые из тех же оптимизаций производительности применимы:

  • myisamchk имеет переменные, которые управляют выделением памяти. Вы можете улучшить производительность, установив эти переменные, как описано в разделе 4.6.3.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_size, read_buffer_size) имеют значение сеанса в дополнение к глобальному значению. Установка значения сеанса ограничивает влияние изменения текущим сеансом и не влияет на других пользователей. Изменение переменной только глобального значения (key_buffer_size, myisam_max_sort_file_size) влияет и на других пользователей. В случае с key_buffer_size, необходимо учитывать, что буфер разделяется с этими пользователями. Например, если вы установите переменную myisamchk key_buffer_size в 128 МБ, вы можете установить соответствующую переменную системы key_buffer_size больше, чем это (если она не установлена больше), чтобы разрешить использование буфера ключей активностью в других сеансах. Однако изменение размера глобального буфера ключей делает буфер недействительным, что приводит к увеличению ввода-вывода на диске и замедлению работы других сеансов. Альтернативой, которая избегает этой проблемы, является использование отдельного кэша ключей, присвоение ему индексов из таблицы, подлежащей ремонту, и освобождение его после завершения ремонта. См. раздел 8.10.2.2 «Множественные кэши ключей».

Исходя из вышесказанного, операция REPAIR TABLE может быть выполнена следующим образом, чтобы использовать настройки, аналогичные команде myisamchk. Здесь выделяется отдельный буфер ключей размером 128 МБ, и предполагается, что файловая система позволяет размер файла не менее 100 ГБ.

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 глобально на большое значение выполняется для всех сеансов и может ухудшить производительность из-за чрезмерного выделения памяти для сервера с множеством одновременных сеансов.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/repair-table-optimization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API