Восстановление пространства из небольшой, но интенсивно используемой таблицы MySQL 8 - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть производственный сервер 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

Помимо сложений и вычитаний, столбец данных часто обновляется.

1 Ответ

0 голосов
/ 15 мая 2019

У MyISAM будет другая проблема - фрагментация. После удаления в таблице есть отверстие. Отверстие заполняется первым. Затем делается ссылка на следующий фрагмент записи. В конечном итоге выборка строки повлечет за собой прыжки вокруг большей части таблицы.

Если 300 строк занимает 100 МБ, то строка в среднем составляет 333 КБ? Это довольно большой. И это число сильно варьируется? Много ли у вас столбцов текста / блобов? Они часто меняются? Или это просто удалить и добавить? Не могли бы вы поделиться SHOW CREATE TABLE.

Я не могу представить, как таблица может вырасти в 900 раз, не добавив хотя бы одну очень многобайтную строку, а затем удалив. Возможно, со схемой я мог бы подумать о какой-то причине и / или обходном пути.

...