Я изучал, как оптимизировать только фрагментированные таблицы в 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его, он также покажет одно и то же значение для каждой таблицы в общем табличном пространстве.