Spec-Zone.ru › MySQL 5.7

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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/optimizing-innodb-transaction-management.html

Spec-Zone.ru

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