У меня есть производственный сервер mysql 8, в котором есть таблица для пользовательских сессий для приложения PHP. Я использую innodb_file_per_table. Таблица в любой момент времени мала (около 300-1000 строк), но строки постоянно удаляются и добавляются. Без помех файл sessions.ibd медленно увеличивается, пока не займет все доступное дисковое пространство. Этим утром за столом было 300 записей и заняло более 90 ГБ. Это накапливается в течение длительного периода (месяцев).
Запуск OPTIMIZE TABLE освобождает все дисковое пространство и возвращает таблицу обратно под 100M. Простым решением было бы создать скрипт cron, который запускает OPTIMIZE TABLE раз в неделю в течение периода обслуживания. Еще одно предлагаемое предложение - преобразовать таблицу в таблицу MyISAM, поскольку она не требует каких-либо функций InnoDB. Оба эти решения должны быть эффективными, но они специфичны для таблицы и не защищают от общей проблемы. Я хотел бы знать, есть ли решение этой проблемы, которое включает конфигурацию базы данных.
Вот нестандартные параметры конфигурации innodb, которые мы используем:
innodb-flush-log-at-trx-commit = 1
innodb-buffer-pool-size = 24G
innodb-log-file-size = 512M
innodb-buffer-pool-instances = 8
Есть ли другие варианты, которые мы должны использовать, чтобы файл sessions.ibd не увеличивался непрерывно?
Вот таблица CREATE TABLE для таблицы:
CREATE TABLE `sessions` (
`id` varchar(255) NOT NULL DEFAULT '',
`data` mediumtext,
`expires` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Помимо сложений и вычитаний, столбец данных часто обновляется.