Освобождается ли место на диске сразу после удаления записи в SQL-таблице?

«Освобождается ли место на диске сразу после удаления записи в SQL-таблице?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, место на диске не освобождается немедленно. Удаленная запись обычно помечается как неиспользуемая, и это пространство становится доступным для последующих операций INSERT или UPDATE в рамках той же таблицы.

Типичное поведение СУБД (на примере InnoDB в MySQL):

  1. DELETE помечает строку как удаленную в структуре данных (например, в B-дереве).
  2. Физическое пространство на диске не возвращается файловой системе.
  3. Помеченное пространство остается в табличном пространстве для повторного использования.

Как освободить место операционной системе? Требуется явная операция по дефрагментации и сжатию таблицы:

  • MySQL (InnoDB): OPTIMIZE TABLE table_name;
  • PostgreSQL: VACUUM FULL table_name;
  • Общий подход: Перестройка таблицы: ALTER TABLE table_name ENGINE=InnoDB;

Пример для MySQL:

-- Удаление данных
DELETE FROM large_table WHERE created_at < '2020-01-01';

-- Освобождение и дефрагментация пространства (блокирует таблицу)
OPTIMIZE TABLE large_table;

Рекомендация: Операции типа OPTIMIZE TABLE выполняются с блокировками и нагружают диск. В production их следует планировать на время минимальной нагрузки.