Как очистить накладные расходы (data_free) в таблице памяти в MySQL?
Вопрос
У меня есть таблица памяти в MySQL для живого чата (возможно, это не лучший тип таблицы для этого?), И удаление рядов каждую ночь, чтобы поддерживать учебные журналы в чате в столе. Однако, поскольку вы не можете запустить оптимизацию на таблице памяти, как избавиться от накладных расходов (Data_free
в show table status
)?
Решение
Как избавиться от накладных расходов?
Вы можете заставить таблицу, используя двигатель памяти/кучи для восстановления остаточного пространства, потерянного из удаленных строк, изменяя ее, но не изменив ничего. например
ALTER TABLE my_table ENGINE=MEMORY;
Это повторно записывать стол. Поддержать это цитатой из документация:
Чтобы освободить память, используемую строками, которые были удалены, используйте Alter Table Engine = память, чтобы заставить таблицу восстановить.
РЕДАКТИРОВАТЬ
Может быть, это не лучший тип таблицы для этого?
По моему мнению, это не похоже на идеальное применение таблицы памяти - в целом, я считаю его устаревшим двигателем. Немного еды для размышлений
Во-первых, таблицы памяти не могут/не использовать индексы B-Tree (только хеш-индексы), поэтому запросы, которые в противном случае могли бы использовать индекс для упорядочения или диапазона (то есть <,> Operations), прибегают к сортировке/фильтрации вручную/исчерпывающей.
Во -вторых, таблицы InnoDB будут находиться в оперативной памяти, если ваш innodb_buffer_pool достаточно большой и лучше работает с одновременными потоками, поэтому он часто работает как не лучше, чем таблица памяти для большинства приложений.
В -третьих, возможно, самое главное, если ваш MySQL когда -либо отключен, вы потеряете все данные в своей таблице. Существуют последствия усечения таблицы также, если вы используете репликацию.