Подтвердить что ты не робот

Повторное использование пространства, занятого удаленными строками?

Я несколько раз читал, что после того, как вы удалили строку в таблице InnoDB в MySQL, ее пространство не используется повторно, поэтому, если вы вносите много INSERT в таблицу, а затем периодически удаляете некоторые строки, таблица будет использовать больше и больше места на диске, как если бы строки вообще не удалялись.

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

Может кто-нибудь, пожалуйста, подумает об этом? Мне нужно сделать много INSERT в таблицу InnoDB, а затем каждые X минут мне нужно УДАЛИТЬ записи, которые больше, чем Y минут. У меня проблема постоянно растущей таблицы InnoDB здесь, или это паранойя?

4b9b3361

Ответ 1

Это паранойя:)

БД не увеличиваются в размерах без необходимости, но для проблем с производительностью пространство также не освобождается.

То, что вы слышали, скорее всего, состоит в том, что если вы удаляете записи, это пространство не возвращается в операционную систему. Вместо этого он сохранялся как пустое пространство для последующего использования БД.

Это происходит потому, что:

  • Для сохранения своих данных в DB необходимо иметь некоторое пространство HD; если у него нет места, он сначала резервирует некоторое пустое пространство.
  • Когда вы вставляете новую строку, используется часть этого пространства.
  • Когда у вас заканчивается свободное пространство, новый блок зарезервирован и т.д.
  • Теперь , когда вы удаляете несколько строк, чтобы предотвратить резервирование все большего количества блоков, его пространство остается свободным, но никогда не возвращается в операционную систему, поэтому вы можете использовать его позже любая потребность в резервировании новых блоков.

Как вы можете видеть, пространство снова используется, но никогда не возвращается. Это ключевой момент для вашего вопроса.

Ответ 2

в innodb, нет практического способа освобождения пространства.

  • использовать в файле таблицы ibdata, который будет вы можете удалить данных в новую таблицу и удалить старые таблицу, таким образом восстанавливая записи.
  • использовать mysqldump и целые партии рецепт для очистки всего сервер. Проверьте следующее:
    http://dev.mysql.com/doc/refman/5.0/en/adding-and-removing.html

Все эти методы становятся непрактичными, когда вы используете огромные таблицы (в моем случае они более 250 ГБ), и вы должны держать их в удалении записей для повышения производительности.

Вам придется серьезно подумать, есть ли у вас достаточно места на вашем жестком диске для выполнения одной из вышеуказанных функций (в моем случае я не думаю, что для всех этих действий достаточно 1 ТБ)

с таблицей Innotab (и самой mysql) параметр довольно ограничен, если имеет серьезный размер базы данных.