почему InnoDB продолжает расти без каждого обновления? - PullRequest
3 голосов
/ 28 декабря 2010

У меня есть таблица, которая состоит из тяжелых пятен, и я хотел провести на ней несколько тестов.

Я знаю, что удаленное пространство не восстанавливается innodb, поэтому я решил повторно использовать существующие записи, обновляя свои собственные значения вместо создания новых записей.

Но я заметил, что если я удаляю и вставляю новую запись, или я делаю ОБНОВЛЕНИЕ на существующем ROW, InnoDB продолжает расти.

Предполагая, что у меня есть 100 строк, каждая из которых хранит 500 КБ информации, мой размер InnoDB составляет 10 МБ, теперь, когда я вызываю UPDATE для всех строк (без вставки / удаления), innodb увеличивается на ~ 8 МБ за каждый выполненный мной запуск. Все, что я делаю, я храню в каждой строке ровно 500 КБ данных, с небольшими изменениями, и размер блоба фиксирован.

Что я могу сделать, чтобы предотвратить это?

Я знаю об оптимизации таблицы, но не могу этого сделать, потому что при регулярном использовании таблица будет иметь размер 60-100 ГБ, а при запуске оптимизации просто остановится весь сервер.

Ответы [ 2 ]

5 голосов
/ 28 декабря 2010

Но я заметил, что если я удаляю и вставляю новую запись, или я делаю ОБНОВЛЕНИЕ на существующем ROW, InnoDB продолжает расти.

InnoDB - это многоверсионная система.

Это означает, что каждый раз, когда вы обновляете или удаляете строку, предыдущая версия строки копируется в специальное место, называемое rollback segment. Исходная запись перезаписывается новыми данными (в случае UPDATE) или помечается как удаленная (в случае DELETE).

Если вы выполняете откат транзакции или выполняете параллельный оператор SELECT (который должен видеть предыдущую версию, поскольку новая еще не зафиксирована), данные извлекаются из rollback segment.

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

Не существует поддерживаемого способа сжатия файлов ibdata*, кроме резервного копирования всей базы данных, удаления и воссоздания файлов InnoDB и восстановления из резервной копии.

Даже если вы используете опцию innodb_file_per_table, табличное пространство отката все еще сохраняется в общих ibdata* файлах.

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

2 голосов
/ 28 декабря 2010

Вы можете уменьшить размер таблицы, запустив запрос оптимизации

OPTIMIZE TABLE table_name;

больше информации можно найти здесь

...