Есть ли значительные затраты на начало и фиксацию транзакции MySQL, даже если в таблицы не внесены изменения?

#mysql #performance #transactions

#mysql #Производительность #транзакции

Вопрос:

Это приложение работает на AWS EC2, используя RDS / MySQL (5.7).

У нас есть скрипт аудита, который посещает каждого пользователя в таблице пользователя MySQL.

Для каждого пользователя мы

  • Безоговорочный запуск транзакции,
  • Возможно, внесите некоторые изменения в запись пользователя и в другие таблицы.
  • Безоговорочно зафиксируйте транзакцию.

Теперь, вероятно (и часто), на шаге 2 не было внесено никаких изменений ни в одну таблицу. Во время проверки кода возник вопрос относительно влияния на производительность запуска / фиксации транзакции для многих записей, когда не было внесено никаких изменений.

Я читал в другом месте, что MySQL оптимизирован для фиксации, а не для отката. Но мне еще предстоит найти обсуждение стоимости запуска / фиксации транзакций, когда никакая работа не была выполнена.

Комментарии:

1. Каково время пинга между вашим клиентом и сервером AWS?

2. Я полагаю, вы имеете в виду между экземпляром EC2 и нашим экземпляром RDS / MySQL. К сожалению, узлы AWS / RDS не поддерживают ping для правил входящего IP. Однако я считаю, что время пинга очень низкое, потому что, когда я проводил свой простой тест (отмечено ниже), потребовалось всего 5 секунд для 10K запусков / фиксаций в жестком цикле. Когда я запустил тот же тест со своего компьютера на RDS, время было жалким. Но это было на домашнем Wi-Fi через программное обеспечение VPN и т.д. Действительно недопустимый тест для моего варианта использования.

3. Вы отвечаете на свой собственный вопрос — 0,5 мс? Это нормально — «самостоятельно ответить» на свой вопрос. Я предлагаю вам сделать это.

Ответ №1:

Короткие транзакции не требуют значительных затрат.

Минимальная стоимость транзакций начинает происходить, когда изменения фактически внесены.

Откаты являются дорогостоящими, только если во время отката необходимо изменить данные, в противном случае это довольно пустая операция.

Фиксация (и, возможно, откат) там, где изменений нет, не должна повлечь за собой штраф.

Ответ №2:

Имейте в виду, что как только вы читаете таблицу InnoDB, независимо от того, явно вы «запустили транзакцию» или нет, InnoDB выполняет аналогичную работу.

Альтернативой запуску транзакции является использование автоматической фиксации. Но автоматическая фиксация не означает, что транзакция не происходит. Автозавершение означает, что транзакция запускается неявно, когда ваш запрос касается таблицы InnoDB, и транзакция автоматически фиксируется, как только запрос выполнен. Вы не можете выполнить более одного оператора и не можете выполнить откат, но в остальном это то же самое, что и явная транзакция.

На самом деле вы ничего не экономите, пытаясь избежать запуска транзакции.

Ответ №3:

Безусловно, есть накладные расходы, и они могут быть довольно значительными. Недавно я работал с клиентом, у которого была именно эта проблема (много пустых коммитов из-за ошибки в их ORM), и их база данных сжигала около 30% процессора при пустых коммит.

Запишите день медленного ведения журнала с помощью long_query_time = 0 (важно!), передайте его через mysqldumpslow или pt-query-digest и посмотрите, есть ли у вас запрос, который просто COMMIT; использует большое количество процессора.

Комментарии:

1. Я провел небольшой тест на экземпляре EC2. Запуск / фиксация 10k без обновлений таблицы последовательно занимает 5-6 секунд. Это php-клиент. Когда я добавил обновление таблицы как часть каждого TXN, тот же цикл в 10 кб занял около 30 секунд. Итак, это не незначительно, но для моего приложения и ожидаемого количества записей я могу смириться со штрафом в 5-6 секунд.

2. Что вам нужно учитывать, так это то, будет ли лучше потратить процессорное время, которое потребляется в другом месте.

3. Итак, 3 мс для транзакции с 1 обновлением? Это кажется немного завышенным, если предположить SSD и только «один» ввод-вывод. (Тем не менее, я думаю, что AWS делает 6 копий.)

4. @RickJames Я думаю, вы имеете в виду Aurora с «6 копиями». Это не относится к обычным RDS.