Но я заметил, что если я удаляю и вставляю новую запись, или я делаю ОБНОВЛЕНИЕ на существующем ROW, InnoDB продолжает расти.
InnoDB
- это многоверсионная система.
Это означает, что каждый раз, когда вы обновляете или удаляете строку, предыдущая версия строки копируется в специальное место, называемое rollback segment
. Исходная запись перезаписывается новыми данными (в случае UPDATE
) или помечается как удаленная (в случае DELETE
).
Если вы выполняете откат транзакции или выполняете параллельный оператор SELECT
(который должен видеть предыдущую версию, поскольку новая еще не зафиксирована), данные извлекаются из rollback segment
.
Проблема в том, что InnoDB
табличное пространство никогда не сжимается . Если табличное пространство заполнено, выделяется новое пространство. Пространство, занимаемое информацией отката от зафиксированных транзакций, также может быть использовано повторно, но если табличное пространство заполнено, оно будет расширено и будет постоянным.
Не существует поддерживаемого способа сжатия файлов ibdata*
, кроме резервного копирования всей базы данных, удаления и воссоздания файлов InnoDB
и восстановления из резервной копии.
Даже если вы используете опцию innodb_file_per_table
, табличное пространство отката все еще сохраняется в общих ibdata*
файлах.
Обратите внимание, что пространство, занимаемое таблицами, и пространство, занимаемое табличным пространством, - это разные вещи. Таблицы можно сжать, запустив OPTIMIZE
, и это сделает их более компактными (внутри табличного пространства), но само табличное пространство нельзя сжать.