У меня есть процесс импорта, который запускается очень часто, и я хочу, чтобы это была сделка типа «все или ничего», то есть транзакция.
Есть много аспектов, и импорт может дать где-то между 100k-1mil + записей. Это соответствует полезной нагрузке от нескольких МБ до нескольких сотен МБ данных.
Я знаю, временные таблицы - еще один вариант, но этот метод кажется очень удобным.
Есть ли какие-то предостережения относительно такого рода практики с большим количеством манипуляций с данными между коммитами? (За пределами типичного пакета загрузки при записи / индексировании после фиксации)
mysql
innodb
mysql-5.5
transaction
тонкий лед
источник
источник
Ответы:
Одним из узких мест, о которых следует знать, является буфер журналов InnoDB. Размер устанавливается innodb_log_buffer_size . Вот что говорит об этом документация MySQL:
Не следует путать буфер журнала InnoDB с пулом буферов InnoDB. Основное различие между ними заключается в их предназначении. InnoDB Log Buffer будет в основном записывать кратковременные изменения, которые записываются в журналы повторов (ib_logfile0, ib_logfile1). Буферный пул InnoDB (по размеру innodb_buffer_pool_size ) кэширует страницы данных и индексов, которые должны быть зафиксированы (если страницы загрязнены) и в конечном итоге записаны) на диск. После подтверждения страницы изменений остаются в оперативной памяти до тех пор, пока не будут удалены с помощью правил LRU.
Большие транзакции должны проходить через Log Buffer. Как уже упоминалось, больший буфер журнала уменьшит дисковый ввод-вывод. Узкое место может представлять только большой коммит.
Возможно, вы захотите посмотреть другие параметры InnoDB для настройки.
У меня есть другие посты об оптимизации InnoDB для дальнейшего исследования
источник