ОПТИМИЗАЦИЯ ТАБЛИЦЫ
Синтаксис
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE
tbl_name [, tbl_name] ...
[WAIT n | NOWAIT]
Описание
OPTIMIZE TABLE имеет две основные функции. Она может использоваться для дефрагментации таблиц или для обновления полнотекстового индекса InnoDB.
WAIT/NOWAIT
Устанавливает таймаут ожидания блокировки. См. WAIT и NOWAIT.
Дефрагментация
OPTIMIZE TABLE работает с таблицами InnoDB (до MariaDB 10.1.1, только если переменная сервера innodb_file_per_table установлена), Aria, MyISAM и ARCHIVE и должна использоваться, если вы удалили большую часть таблицы или внесли много изменений в таблицу с изменяемыми строками (таблицы, имеющие столбцы VARCHAR, VARBINARY, BLOB или TEXT). Удалённые строки хранятся в связанном списке, и последующие INSERT операции повторно используют старые позиции строк.
Для этой команды требуется право SELECT и INSERT для таблицы.
По умолчанию, команды OPTIMIZE TABLE записываются в бинарный журнал и будут реплицированы. Ключевое слово NO_WRITE_TO_BINLOG (LOCAL — псевдоним) гарантирует, что команда не будет записана в бинарный журнал.
Команды OPTIMIZE TABLE не регистрируются в бинарном журнале, если установлено значение read_only. См. также Реплики только для чтения.
OPTIMIZE TABLE также поддерживается для разнесенных таблиц. Вы можете использовать ALTER TABLE ... OPTIMIZE PARTITION для оптимизации одной или нескольких партиций.
Вы можете использовать OPTIMIZE TABLE для освобождения неиспользуемого пространства и дефрагментации файла данных. В других хранилищах OPTIMIZE TABLE по умолчанию ничего не делает и возвращает сообщение: "Хранилище таблицы не поддерживает optimize". Однако, если сервер был запущен с опцией --skip-new, OPTIMIZE TABLE связана с ALTER TABLE и создаёт таблицу заново. Эта операция освобождает неиспользуемое пространство и обновляет статистику индексов.
Хранилище Aria поддерживает отчёт о ходе выполнения для этой команды.
Если таблица MyISAM фрагментирована, одновременные вставки OPTIMIZE TABLE не будут выполняться, пока для этой таблицы не будет выполнена команда OPTIMIZE TABLE, если переменная сервера concurrent_insert не установлена в значение ALWAYS.
Обновление полнотекстового индекса InnoDB
При добавлении или удалении строк в полнотекстовый индекс InnoDB полнотекстовый индекс немедленно не перестраивается, поскольку это может быть дорогостоящей операцией. Статистика изменений хранится в отдельном месте. Полный перестроение полнотекстового индекса происходит только при выполнении команды OPTIMIZE TABLE.
По умолчанию, OPTIMIZE TABLE дефрагментирует таблицу. Для использования её для обновления статистики полнотекстового индекса, переменная системы innodb_optimize_fulltext_only должна быть установлена в значение 1. Это временное значение, и его следует сбросить до 0 после перестроения полнотекстового индекса.
Поскольку перестройка полнотекстового индекса может занять много времени, переменная innodb_ft_num_word_optimize ограничивает перестройку количеством слов (по умолчанию 2000). Вы можете выполнить несколько команд OPTIMIZE для полного перестроения индекса.
Дефрагментация табличных пространств InnoDB
MariaDB 10.1.1 объединила исправление Facebook/Kakao для дефрагментации, позволяя использовать OPTIMIZE TABLE для дефрагментации табличных пространств InnoDB. Для активации этой функции переменная системы innodb_defragment должна быть включена. Новые таблицы не создаются, и нет необходимости копировать данные из старых таблиц в новые. Вместо этого эта функция загружает n страницы (определяемые innodb-defragment-n-pages) и пытается перемещать записи так, чтобы страницы были заполнены записями, а затем освобождает страницы, которые полностью пустые после операции. Обратите внимание, что файлы табличного пространства (включая ibdata1) не уменьшатся в результате дефрагментации, но вы получите лучшее использование памяти в кэше InnoDB, поскольку используется меньше страниц данных.
См. Дефрагментация табличных пространств InnoDB для получения более подробной информации.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/optimize-table/