Если вы часто обновляете большие BLOB-объекты, он действительно может временно использовать много места и оставить фрагментированное табличное пространство.
Обновление копирует исходные страницы данных в «журнал отмен», который является просто областью страниц в табличном пространстве.InnoDB сохраняет эти скопированные страницы на случай, если вы откатите свою транзакцию и восстановите исходные данные.После того, как вы подтвердите свое обновление, копия в журнале отмены больше не нужна, и InnoDB будет постепенно очищаться.Но если ваши обновления, как вы говорите, частые, вы можете накапливать мусор в журнале отмены быстрее, чем InnoDB может его очистить.
В любом случае расширение хранилища для большего количества содержимого журнала отмены приведет к увеличению табличного пространства,и даже после очистки InnoDB табличное пространство не будет сокращаться.Он всегда будет иметь размер своей верхней отметки.
Чтобы смягчить это, MySQL 5.6 ввел опцию, позволяющую сохранять журнал отмены за пределами системного табличного пространства, а MySQL 5.7 представил функцию обрезанияотменить журналы после того, как они убраны.Прочитайте https://dev.mysql.com/doc/refman/5.7/en/innodb-undo-tablespaces.html для получения дополнительной информации об этих функциях.
Если вам интересна внутренняя структура файлов InnoDB, я рекомендую попробовать инструменты с открытым исходным кодом, которые написал Джереми Коул: https://github.com/jeremycole/innodb_ruby/wiki
Вы можете создавать различные сводки того, что находится в вашем табличном пространстве ibdata1.Большая часть файла может быть неиспользована, но все еще занимает место.
Вот пример из моей локальной песочницы MySQL.У меня есть только одна таблица с innondb_file_per_table=0
(все остальные таблицы находятся за пределами центрального табличного пространства).Я запустил эту команду:
innodb_space -s /usr/local/var/mysql/ibdata1 -T mydatabase/mytable space-extents-illustrate
Вот иллюстрация, которую он создал.Легенда (не входит в комплект) показала, что данные и индексы для одной моей таблицы попали на страницы между 3008 и 3392. Другими вещами были в основном системные структуры данных InnoDB (черные), системные таблицы, буферы вставок (темно-желтые) и незанятые.страницы (серый).