8.5.2 Оптимизация управления транзакциями InnoDB
Для оптимизации обработки транзакций InnoDB найдите оптимальный баланс между накладными расходами транзакционных функций и нагрузкой вашего сервера. Например, приложение может столкнуться с проблемами производительности, если оно выполняет тысячи коммитов в секунду, и с другими проблемами производительности, если коммиты происходят только раз в 2-3 часа.
-
Значение по умолчанию MySQL
AUTOCOMMIT=1может наложить ограничения на производительность загруженного сервера базы данных. В тех случаях, где это практично, объедините несколько связанных операций изменения данных в одну транзакцию, используя операторSET AUTOCOMMIT=0или операторSTART TRANSACTION, а затем операторCOMMITпосле внесения всех изменений.InnoDBдолжен записать журнал на диск при каждом коммите транзакции, если эта транзакция внесла изменения в базу данных. Когда каждое изменение сопровождается коммитом (как в случае с настройкой autocommit по умолчанию), пропускная способность ввода-вывода устройства хранения данных ограничивает число потенциальных операций в секунду. В качестве альтернативы, для транзакций, состоящих только из одного оператора
SELECT, включениеAUTOCOMMITпомогаетInnoDBраспознать только-для-чтения транзакции и оптимизировать их. См. Раздел 8.5.3, «Оптимизация только-для-чтения транзакций InnoDB» для требований.-
Избегайте выполнения отката после вставки, обновления или удаления огромного количества строк. Если большая транзакция замедляет производительность сервера, ее откат может ухудшить проблему, потенциально потребовав в несколько раз больше времени, чем исходные операции изменения данных. Прерывание процесса базы данных не помогает, так как откат начинается заново при запуске сервера.
Чтобы минимизировать вероятность возникновения этой проблемы:
Увеличьте размер так, чтобы все изменения данных можно было кэшировать вместо немедленной записи на диск.
Установите
innodb_change_buffering=all, чтобы буферизовать операции обновления и удаления в дополнение к операциям вставки.Рассмотрите возможность периодически выполнять операторы
COMMITво время операции изменения больших данных, возможно, разбивая одно удаление или обновление на несколько операторов, работающих с меньшим количеством строк.
Чтобы избавиться от неуправляемого отката после его возникновения, увеличьте пул буфера так, чтобы откат стал ограниченным процессором и выполнялся быстро, или остановите сервер и перезапустите его с
innodb_force_recovery=3, как описано в Разделе 14.19.2, «Восстановление InnoDB».Ожидается, что эта проблема будет редка при значении по умолчанию
innodb_change_buffering=all, которое позволяет кэшировать операции обновления и удаления в памяти, что делает их выполнение быстрее в первую очередь и также быстрее при необходимости отката. Убедитесь, что вы используете это значение параметра на серверах, которые обрабатывают долговременные транзакции с множеством вставок, обновлений или удалений. -
Если вы можете позволить себе потерю некоторых последних коммитированных транзакций в случае непредвиденного завершения работы, вы можете установить параметр
innodb_flush_log_at_trx_commitв значение 0.InnoDBпытается записать журнал на диск один раз в секунду, хотя запись не гарантируется. Также установите значение параметраinnodb_support_xaв 0, что уменьшает число записей на диск из-за синхронизации данных на диске и двоичного журнала.Примечаниеinnodb_support_xaустарел; ожидается его удаление в будущих релизах. Начиная с MySQL 5.7.10,InnoDBподдержка двухфазного коммита в транзакциях XA всегда включена, и отключениеinnodb_support_xaбольше не разрешается. При изменении или удалении строк строки и связанные не удаляются физически немедленно или даже немедленно после коммита транзакции. Старые данные сохраняются до тех пор, пока не завершатся транзакции, начатые ранее или одновременно, чтобы эти транзакции могли получить доступ к предыдущему состоянию измененных или удаленных строк. Таким образом, долговременная транзакция может предотвратить
InnoDBот очистки данных, измененных другой транзакцией.При изменении или удалении строк в долговременной транзакции другие транзакции, использующие уровни изоляции
READ COMMITTEDиREPEATABLE READ, должны выполнить больше работы для восстановления более старых данных, если они читают те же самые строки.-
Когда долговременная транзакция изменяет таблицу, запросы к этой таблице от других транзакций не используют технику. Запросы, которые обычно могли бы извлечь все столбцы результата из вторичного индекса, вместо этого ищут соответствующие значения в данных таблицы.
Если страницы вторичного индекса имеют
PAGE_MAX_TRX_ID, который слишком новый, или если записи во вторичном индексе помечены на удаление,InnoDBможет потребоваться найти записи с помощью кластерного индекса.
© 2025 Oracle
Licensed under the GPLv2 License.