Назад | Перейти на главную страницу

Использование данных / памяти MySQL NDB

Я использую быстрорастущий кластер NDB, и у меня ограниченная (8 ГБ) физической памяти на каждом из двух узлов данных. Я беспокоюсь, что у меня закончится память данных, поэтому я начал удалять старые данные. Однако удаление не показывает значительного снижения статистики использования. Любые идеи / объяснения почему?

Вот статистика до этого:

ndb_mgm> all report mem
Node 11: Data usage is 44%(85073 32K pages of total 192000)
Node 11: Index usage is 22%(20428 8K pages of total 89632)
Node 12: Data usage is 43%(83800 32K pages of total 192000)
Node 12: Index usage is 22%(20425 8K pages of total 89632)

и вот статистика после того, как я удалил около трети данных.

ndb_mgm> all report mem
Node 11: Data usage is 41%(80557 32K pages of total 192000)
Node 11: Index usage is 15%(14223 8K pages of total 89632)
Node 12: Data usage is 41%(79274 32K pages of total 192000)
Node 12: Index usage is 15%(14226 8K pages of total 89632)

Как видите, использование индекса сократилось значительно больше, чем использование данных. Что еще нужно сделать, чтобы освободить место для данных, которые я удалил?

P.S. В основном я удалял строки из таблиц с большими размерами строк. Когда я сравнил статистику таблиц, я заметил это на одной из очищенных таблиц:

        Rows   | Avg_row_length | Data_length
Before 1858558 |             88 |   399147008
After   241832 |             88 |   398884864

Почему длина данных оставалась высокой?

Если возможно, вам следует изменить заголовок вашего вопроса: заголовок ссылается на Innodb, но ваш вопрос касается NDB.

В любом случае, когда вы выполняете удаление в NDB, это просто освобождает пространство памяти для будущего использования этой таблицей. Если вы хотите действительно освободить его, вы можете выполнить непрерывный перезапуск узлов данных или оптимизировать таблицу (в зависимости от вашей версии). Видеть: http://docs.oracle.com/cd/E17952_01/refman-5.1-en/mysql-cluster-limitations-limits.html

Соответствующая цитата: «Оператор DELETE в таблице NDB делает память, ранее используемую удаленными строками, доступной для повторного использования путем вставки только в ту же таблицу. Однако эту память можно сделать доступной для общего повторного использования, выполнив прокрутку перезапуск кластера (см. Раздел 17.5.5, «Выполнение непрерывного перезапуска кластера MySQL»).

Начиная с MySQL Cluster NDB 6.3.7, это ограничение можно преодолеть с помощью OPTIMIZE TABLE. Для получения дополнительной информации см. Раздел 17.1.6.11, «Предыдущие проблемы кластера MySQL, решенные в MySQL 5.1, MySQL Cluster NDB 6.x и MySQL Cluster NDB 7.x».

Надеюсь, это поможет.

Innodb не передает свободное пространство файловой системе, вместо этого оно будет использоваться будущими вставками. Если вы используете innodb_file_per_table параметр в вашей конфигурации, вы можете освободить свободное пространство, выполнив OPTIMIZE TABLE. Если это не единственный известный мне способ, это экспортировать базу данных, остановить mySQL и вручную удалить файлы данных, а затем снова импортировать базу данных.

Есть очень похожий вопрос на SO.