2009-03-11 8 views
22

Я несколько раз читал, что после того, как вы удалили строку в таблице InnoDB в MySQL, ее пространство не будет повторно использовано, поэтому, если вы сделаете много INSERT в таблицу, а затем периодически УДАЛИТЕ несколько строк, таблица будет использовать все больше и больше пространство на диске, как если бы строки вообще не удалялись.Повторное использование пространства, занятого удаленными строками?

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

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

ответ

30

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

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

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

Это потому, что:

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

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

+0

Seb, пожалуйста, дайте официальную ссылку для этого? –

+0

@GautamSomani Это ответ на 6 лет, у меня нет ссылок, но я мог бы найти это: https://dev.mysql.com/doc/refman/5.1/en/optimize-table.html: ' Удаленные строки сохраняются в связанном списке, а последующие операции INSERT повторно используют старые позиции строк. Вы можете использовать OPTIMIZE TABLE для восстановления неиспользуемого пространства и дефрагментации файла данных. После обширных изменений в таблице этот оператор может также повысить производительность операторов, которые используют таблицу, иногда значительно. «Я уверен, что если вы Google, вы сможете найти более официальную информацию об этом. – Seb

2

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

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

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

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

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

+0

Есть решения для этого, с новыми версиями InnoDB и правильной конфигурацией ('innodb_file_per_table'): http://dev.mysql.com/doc/innodb-plugin/1.0/en/innodb-other-changes-truncate. html http://dev.mysql.com/doc/refman/5.5/en/innodb-truncate-table-reclaim-space.html – Blaisorblade