InnoDB Purge
Когда транзакция обновляет строку в таблице InnoDB, реализация MVCC InnoDB сохраняет старые версии строки в журнале отката InnoDB. Старые версии хранятся как минимум до тех пор, пока все транзакции, более старые, чем транзакция, обновившая строку, не будут закрыты. В этот момент старые версии можно удалить. InnoDB имеет процесс очистки, который используется для удаления этих старых версий.
Оптимизация производительности очистки
Настройка потоков очистки
Количество потоков очистки можно установить, настроив системную переменную innodb_purge_threads. Эту системную переменную можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_purge_threads = 6
Настройка размера пакета очистки
Размер пакета очистки определяется как количество записей журнала переопределения InnoDB, которые должны быть записаны перед запуском очистки. Размер пакета очистки можно установить, настроив системную переменную innodb_purge_batch_size. Эту системную переменную можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_purge_batch_size = 50
Настройка максимальной задержки очистки
Если операции очистки отстают на загруженном сервере, то это может быть сложной ситуацией для восстановления. В качестве решения InnoDB позволяет вам установить максимальную задержку очистки. Максимальная задержка очистки определяется как максимальное количество записей журнала отката InnoDB, которые могут ожидать очистки из истории, до тех пор пока InnoDB не начнёт задерживать операторы DML.
Максимальную задержку очистки можно установить, настроив системную переменную innodb_max_purge_lag. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:
SET GLOBAL innodb_max_purge_lag=1000;
Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_max_purge_lag = 1000
Максимальную задержку можно установить, настроив системную переменную innodb_max_purge_lag_delay. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:
SET GLOBAL innodb_max_purge_lag_delay=100;
Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_max_purge_lag_delay = 100
Настройка частоты усечения сегментов отката очистки
Частота усечения сегментов отката очистки определяется как количество циклов очистки, которые выполняются до усечения ненужных сегментов отката. Частоту усечения сегментов отката очистки можно установить, настроив системную переменную innodb_purge_rseg_truncate_frequency. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:
SET GLOBAL innodb_purge_rseg_truncate_frequency=64;
Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_purge_rseg_truncate_frequency = 64
Настройка усечения журнала отката очистки
Усечение журнала отката очистки происходит, когда InnoDB усекает целую табличную область журнала отката InnoDB, а не удаляет отдельные записи журнала отката InnoDB.
Усечение журнала отката очистки можно включить, настроив системную переменную innodb_undo_log_truncate. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:
SET GLOBAL innodb_undo_log_truncate=ON;
Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_undo_log_truncate = ON
Таблица пространства данных журнала отката InnoDB усекается, когда она превышает максимальный размер, настроенный для табличных областей журнала отката InnoDB. Максимальный размер можно установить, настроив системную переменную innodb_max_undo_log_size. Эту системную переменную можно изменить динамически с помощью SET GLOBAL. Например:
SET GLOBAL innodb_max_undo_log_size='64M';
Эту системную переменную также можно указать в качестве аргумента командной строки для mysqld, или же в соответствующей группе параметров сервера в файле опций группа параметров в файле параметров. Например:
[mariadb] ... innodb_max_undo_log_size = 64M
Влияние очистки на метаданные строк
Кластерный индекс таблицы InnoDB имеет три скрытых системных столбца, которые автоматически генерируются. Эти скрытые системные столбцы:
-
DB_ROW_ID- Если таблица не имеет другихPRIMARY KEYили другихUNIQUE KEYопределённых какNOT NULLкоторые могут быть подняты доPRIMARY KEYтаблицы, тогда InnoDB будет использовать скрытый системный столбец, называемыйDB_ROW_ID. InnoDB автоматически сгенерирует значение для столбца из глобальной 48-битной последовательности InnoDB (вместо того, чтобы быть локальной для таблицы). -
DB_TRX_ID- Идентификатор транзакции либо транзакции, которая последней изменила строку, либо транзакции, которая в настоящее время блокирует строку. -
DB_ROLL_PTR- Указатель на журнал отката InnoDB, содержащий предыдущую запись строки. ЗначениеDB_ROLL_PTRявляется допустимым только еслиDB_TRX_IDпринадлежит текущей точке чтения. Самая старая допустимая точка чтения — это точка чтения очистки.
Если последняя запись журнала отката InnoDB строки удалена, это очевидно повлияет на значение столбца DB_ROLL_PTR строки, потому что больше не будет никакой записи журнала отката InnoDB для ссылки.
В MariaDB 10.2 и ранее, процесс очистки не трогал значение столбца DB_TRX_ID строки.
Однако, в MariaDB 10.3 и более поздних версиях, процесс очистки установит значение столбца DB_TRX_ID строки в 0 после того как все связанные записи журнала отката InnoDB строки были удалены. Эта смена позволяет InnoDB выполнить оптимизацию: если запрос хочет прочитать строку, и если столбец DB_TRX_ID строки установлен в 0, то он знает, что ни одна другая транзакция не блокирует строку. Обычно InnoDB необходимо заблокировать мьютекс системы транзакций, чтобы безопасно проверить, заблокирована ли строка, но эта оптимизация позволяет InnoDB подтвердить, что строка может быть безопасно прочитана без каких-либо тяжёлых внутренних блокировок.
Эта оптимизация может ускорить чтение, но это имеет ощутимую цену в других случаях. Например, она может привести к тому, что процесс очистки будет использовать больше ввода-вывода после вставки большого количества строк, так как значение столбца DB_TRX_ID каждой строки нужно будет сбросить.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-purge/