Используется ли пространство, занимаемое удаленными строками, повторно? - PullRequest
23 голосов
/ 11 марта 2009

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

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

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

Ответы [ 2 ]

32 голосов
/ 11 марта 2009

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

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

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

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

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

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

2 голосов
/ 14 ноября 2009

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

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

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

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

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

...