Я изучал, как оптимизировать только фрагментированные таблицы в MySQL, и рассмотрел этот пост по оптимизации таблиц . Он в основном выполняет запрос к базе данных information_schema для любой таблицы data_free > 0
и создает инструкцию SQL OPTIMIZE
только для этих таблиц. Я выполнил этот запрос, и он определил 148 таблиц для оптимизации. Все указанные таблицы являются таблицами InnoDB. После выполнения результирующего сценария SQL оптимизации я повторно запустил исходный сценарий, чтобы определить фрагментированные таблицы, и он возвратил точно такие же таблицы во время первого прохода.
Я видел противоречивые сообщения, касающиеся таблиц InnoDB и OPTIMIZE
команды. Некоторые говорят, что OPTIMIZE
не будет работать с таблицами InnoDB и что вам нужно работать ALTER TABLE table_name ENGINE=INNODB
. Другие говорят, что OPTIMIZE
фактически вызывает ALTER TABLE
команду при выполнении с таблицами InnoDB. Имея это в виду, я запустил ALTER TABLE
команду для одной из таблиц InnoDB, идентифицированных как фрагментированные ( data_free > 0
), и обнаружил, что data_free
впоследствии она не изменилась. Это все еще больше чем 0. Я также перезапустил MySQL и проверил это только, чтобы найти те же самые результаты.
Теперь у нас есть несколько серверов с MySQL 5.5.29 в нашей организации, и я выполнил запрос ко всем из них, чтобы идентифицировать любые таблицы InnoDB, DATA_FREE=0 or NULL
и ни один из них не был возвращен. Все они больше нуля.
Я также запустил OPTIMIZE
команду для нескольких MyISAM
таблиц, значение которых DATA_FREE
было больше нуля, и впоследствии проверил, что оно было равно нулю.
Кто-нибудь может пролить свет на это для меня? Как правильно удалить фрагменты из таблиц InnoDB? Как правильно определить фрагментированные таблицы InnoDB?
Спасибо
innodb_file_per_table
его, он также покажет одно и то же значение для каждой таблицы в общем табличном пространстве.