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

StackOverflow https://stackoverflow.com/questions/634257

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top