У меня есть таблица InnoDB, которую нужно обновлять каждые десять минут в пределах от 60 к до 200 тыс. записей. Наш подход к этому моменту был следующим:
- Отключить автосообщение
- Обрезать таблицу
- Выполнить выбор запросов и дополнительных вычислений (используя PHP)
- Вставить новые записи
- Фиксировать
После выполнения операции Truncate данные немедленно удаляются и больше не доступны из пользовательского интерфейса. Для наших пользователей это было довольно неприятно, хотя в течение примерно 30 секунд или около того script встречается с операцией Commit, и таблица повторно заселена.
Я подумал, что, возможно, я мог бы обернуть всю операцию, включая Truncate, в транзакцию, и что это может сократить время, в течение которого таблица становится пустой для пользователей. Поэтому я изменил "SET AUTOCOMMIT = 0" на "START TRANSCATION".
Yikes! Это было противоположно желаемому эффекту! Теперь операция TRUNCATE по-прежнему выполняется в начале script, но для выполнения операций INSERT в транзакции требуется MUCH, чтобы к тому времени, когда операция COMMIT и данные в таблице снова будут доступны, это было почти десять минут!
Что может быть причиной этого? Честно говоря, я не ожидал никаких изменений вообще, потому что у меня создалось впечатление, что инициирование транзакции в основном просто отключает Autocommit?