Как очистить накладные расходы (data_free) в таблице памяти в MySQL?

StackOverflow https://stackoverflow.com/questions/4575035

  •  14-10-2019
  •  | 
  •  

Вопрос

У меня есть таблица памяти в MySQL для живого чата (возможно, это не лучший тип таблицы для этого?), И удаление рядов каждую ночь, чтобы поддерживать учебные журналы в чате в столе. Однако, поскольку вы не можете запустить оптимизацию на таблице памяти, как избавиться от накладных расходов (Data_free в show table status)?

Это было полезно?

Решение

Как избавиться от накладных расходов?

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

ALTER TABLE my_table ENGINE=MEMORY;

Это повторно записывать стол. Поддержать это цитатой из документация:

Чтобы освободить память, используемую строками, которые были удалены, используйте Alter Table Engine = память, чтобы заставить таблицу восстановить.

РЕДАКТИРОВАТЬ

Может быть, это не лучший тип таблицы для этого?

По моему мнению, это не похоже на идеальное применение таблицы памяти - в целом, я считаю его устаревшим двигателем. Немного еды для размышлений

Во-первых, таблицы памяти не могут/не использовать индексы B-Tree (только хеш-индексы), поэтому запросы, которые в противном случае могли бы использовать индекс для упорядочения или диапазона (то есть <,> Operations), прибегают к сортировке/фильтрации вручную/исчерпывающей.

Во -вторых, таблицы InnoDB будут находиться в оперативной памяти, если ваш innodb_buffer_pool достаточно большой и лучше работает с одновременными потоками, поэтому он часто работает как не лучше, чем таблица памяти для большинства приложений.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top