Канал разработчика и поисковика ДПСО LizaAlert
Связь: @sleeplessfeedbackbot или Direct канала (они бесплатные)
По рекламе: @dpp_ads
Купить рекламу: https://telega.in/c/sleeplesscode
Post #746
2.2K
И снова привет! Продолжаем наши похождения по удалениям.
Мы уже обсудили две важные вещи:
-
- после
Возникает логичный вопрос: а как тогда удалять?
И ответ на него одновременно простой и нет — soft delete.
Что такое soft delete
В этой методике мы не удаляем строку, а просто помечаем её как удалённую.
То есть вместо:
мы делаем:
Для приложения запись сразу считается удалённой,
но физически она остаётся в таблице.
Почему это дешевле
1. Мы почти не трогаем индексы
Поле
а значит — меньше модификаций страниц и меньше дисковых операций.
2. Меньше WAL
UPDATE одного поля пишет меньше данных в WAL,
что снижает нагрузку на диск и упрощает репликацию.
3. Меньше блокировок и побочных эффектов
Нет постоянного потока тяжёлых DELETE,
система ведёт себя стабильнее под нагрузкой.
Почему deleted_at, а не is_deleted
Чаще всего используют именно
- известно, когда запись была удалена
- можно откатить удаление по дате
- удобно строить TTL-чистку на основе времени удаления.
«Но ведь строки остаются в таблице»
Да. И в этом весь смысл.
Мы разделяем удаление на два этапа:
1. Быстро и дёшево убираем данные из пользовательского флоу в любой момент времени.
2. Медленно и аккуратно удаляем их физически позже —
например, ночью, когда система нагружена меньше.
И небольшой приятный бонус
Когда пользователь пишет: «Я СЛУЧАЙНО НАЖАЛ УДАЛИТЬ, ВЕРНИТЕ» — у вас уже есть TTL-окно, в которое это можно спокойно сделать 😉
#devblogHowToDeleteInDatabase #tech
Мы уже обсудили две важные вещи:
-
DELETE — тяжёлая операция;- после
DELETE в базе остаётся мусор.Возникает логичный вопрос: а как тогда удалять?
И ответ на него одновременно простой и нет — soft delete.
Что такое soft delete
В этой методике мы не удаляем строку, а просто помечаем её как удалённую.
То есть вместо:
DELETE FROM messages WHERE id = 993;
мы делаем:
UPDATE messages
SET deleted_at = now()
WHERE id = 993;
Для приложения запись сразу считается удалённой,
но физически она остаётся в таблице.
Почему это дешевле
1. Мы почти не трогаем индексы
Поле
deleted_at обычно не входит в основные индексы,а значит — меньше модификаций страниц и меньше дисковых операций.
2. Меньше WAL
UPDATE одного поля пишет меньше данных в WAL,
что снижает нагрузку на диск и упрощает репликацию.
3. Меньше блокировок и побочных эффектов
Нет постоянного потока тяжёлых DELETE,
система ведёт себя стабильнее под нагрузкой.
Почему deleted_at, а не is_deleted
Чаще всего используют именно
deleted_at timestamptz, потому что:- известно, когда запись была удалена
- можно откатить удаление по дате
- удобно строить TTL-чистку на основе времени удаления.
«Но ведь строки остаются в таблице»
Да. И в этом весь смысл.
Мы разделяем удаление на два этапа:
1. Быстро и дёшево убираем данные из пользовательского флоу в любой момент времени.
2. Медленно и аккуратно удаляем их физически позже —
например, ночью, когда система нагружена меньше.
И небольшой приятный бонус
Когда пользователь пишет: «Я СЛУЧАЙНО НАЖАЛ УДАЛИТЬ, ВЕРНИТЕ» — у вас уже есть TTL-окно, в которое это можно спокойно сделать 😉
#devblogHowToDeleteInDatabase #tech
- 👍 37
- ❤ 14
- 🙏 3
- 🎃 1
- 🦄 1










