Как вы очищаете накладные расходы (Data_free) в таблице MEMORY в MySQL? - PullRequest
4 голосов
/ 01 января 2011

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

1 Ответ

4 голосов
/ 01 января 2011

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

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

ALTER TABLE my_table ENGINE=MEMORY;

Перезапишет таблицу.Подкрепите это цитатой из документации :

Чтобы освободить память, используемую удаленными строками, используйте ALTER TABLE ENGINE = MEMORY для принудительного перестроения таблицы.

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

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

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

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

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

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

...