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

MySQL show table status всегда возвращает Data_free 17825792

Когда я выполняю SHOW TABLE STATUS databaseName;

Я получаю информацию Data_free со значением 17825792 во всех таблицах:

| Name             | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options     | Comment                                    |

| ubqACL           | InnoDB |      10 | Compact    |    0 |              0 |       16384 |               0 |        16384 |  17825792 |              1 | 2011-08-23 17:45:48 | NULL                | NULL       | utf8_general_ci   |     NULL |                    | Access Control List per a ubqDocs          |
| ubqAssociacions  | InnoDB |      10 | Compact    | 1216 |            148 |      180224 |               0 |       262144 |  17825792 |           1246 | 2011-08-23 17:45:48 | NULL                | NULL       | utf8_general_ci   |     NULL |                    | Vincles entre documents                    |

ядро базы данных - InnoDB.

Я хочу получить это значение для расчета фрагментации и запуска действий по оптимизации.

Причина, по которой Data_free всегда возвращается с одним и тем же номером в каждой таблице, проста:

  • Вы не используете innodb_file_per_table
  • Все ваши данные InnoDB находятся внутри этого большого файла с именем / var / lib / mysql / ibdata1.

Пока существуют эти два условия, вы никогда не избавитесь от фрагментации. Любая попытка запустить OPTIMIZE TABLE для таблицы InnoDB сделает данные и индексы для таблицы смежными, но будут добавлены к ibdata1, что сделает ibdata1 намного больше.

В свете этого вы должны знать, что находится внутри ibdata1. Внутри есть четыре (4) типа информации:

  • Страницы данных таблицы
  • Индексные страницы таблицы
  • Таблица метаданных
  • MVCC Данные

Вы должны сделать четыре (4) основных вещи:

  • Дамп всех баз данных
  • Удалить ibdata1
  • Переконфигурируйте InnoDB с помощью innodb_file_per_table
  • Перезагрузить дамп

Это позволит сохранить все данные и индексы вне ibdata1 и сохранить их в отдельных файлах .ibd. Оттуда вы можете запустить OPTIMIZE TABLE для таблицы InnoDB, настроенной как innodb_file_per_table. Таким образом, файлы .ibd можно дефрагментировать по отдельности.

Это сделает ibdata1 настолько маленьким, насколько это возможно, и никогда больше не станет бесконтрольно расти. Все заботы о дефрагментации InnoDB можно найти в ТАБЛИЦЕ ОПТИМИЗАЦИИ.

- Следует отметить, что OPTIMIZE TABLE для таблицы INNODB работает немного иначе, чем использование других механизмов хранения. У Percona есть хорошая статья об увеличении скорости OPTIMIZE TABLE и о том, когда вы должны / не должны рассматривать выполнение указанного действия Вот.

«Для таблиц InnoDB OPTIMIZE TABLE отображается в ALTER TABLE, который перестраивает таблицу для обновления статистики индекса и освобождения неиспользуемого пространства в кластеризованном индексе».

Подробнее о «ОПТИМИЗАЦИЯ ТАБЛИЦЫ»