Повторное использование пространства, занятого удаленными строками?
Я несколько раз читал, что после того, как вы удалили строку в таблице InnoDB в MySQL, ее пространство не используется повторно, поэтому, если вы вносите много INSERT в таблицу, а затем периодически удаляете некоторые строки, таблица будет использовать больше и больше места на диске, как если бы строки вообще не удалялись.
Недавно мне сказали, что пространство, занятое удаленными строками, повторно используется, но только после завершения некоторых транзакций и даже тогда - не полностью. Я теперь смущен.
Может кто-нибудь, пожалуйста, подумает об этом? Мне нужно сделать много INSERT в таблицу InnoDB, а затем каждые X минут мне нужно УДАЛИТЬ записи, которые больше, чем Y минут. У меня проблема постоянно растущей таблицы InnoDB здесь, или это паранойя?
Ответы
Ответ 1
Это паранойя:)
БД не увеличиваются в размерах без необходимости, но для проблем с производительностью пространство также не освобождается.
То, что вы слышали, скорее всего, состоит в том, что если вы удаляете записи, это пространство не возвращается в операционную систему. Вместо этого он сохранялся как пустое пространство для последующего использования БД.
Это происходит потому, что:
- Для сохранения своих данных в DB необходимо иметь некоторое пространство HD; если у него нет места, он сначала резервирует некоторое пустое пространство.
- Когда вы вставляете новую строку, используется часть этого пространства.
- Когда у вас заканчивается свободное пространство, новый блок зарезервирован и т.д.
- Теперь , когда вы удаляете несколько строк, чтобы предотвратить резервирование все большего количества блоков, его пространство остается свободным, но никогда не возвращается в операционную систему, поэтому вы можете использовать его позже любая потребность в резервировании новых блоков.
Как вы можете видеть, пространство снова используется, но никогда не возвращается. Это ключевой момент для вашего вопроса.
Ответ 2
в innodb, нет практического способа освобождения пространства.
Все эти методы становятся непрактичными, когда вы используете огромные таблицы (в моем случае они более 250 ГБ), и вы должны держать их в удалении записей для повышения производительности.
Вам придется серьезно подумать, есть ли у вас достаточно места на вашем жестком диске для выполнения одной из вышеуказанных функций (в моем случае я не думаю, что для всех этих действий достаточно 1 ТБ)
с таблицей Innotab (и самой mysql) параметр довольно ограничен, если имеет серьезный размер базы данных.