Spec-Zone.ru › MySQL 9.2

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 Переменная Системная переменная
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 больше этого значения (если она уже не установлена больше), чтобы позволить использованию буфера ключей активностью в других сеансах. Однако изменение размера глобального буфера ключей делает буфер недействительным, что приводит к увеличению ввода-вывода с диска и замедлению работы других сеансов. Альтернативой, которая избегает этой проблемы, является использование отдельного кэша ключей, назначение ему индексов из таблицы, подлежащей восстановлению, и освобождение его по завершении восстановления. См. раздел 10.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-8.4-en/repair-table-optimization.html

Spec-Zone.ru

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