Как избавляться от ненужных записей в бд?
Изучил данную статью и появился вопрос: https://habr.com/ru/articles/305694/
Например если пользователь начал процесс аутентификации и ушел. Запись уже появилась в бд и судя по всему будет лежать там вечно. В дальнейшем это повысит нагрузку на бд при поиске записей. Как этого можно избежать?
Дополнительно:
В дальнейшем это повысит нагрузку на бд при поиске записей.
При наличии правильного индекса проблема нехватки дискового пространства придёт раньше, чем проблема нагрузки при поиске.
Ответы:
Если использовать такие БД как DymanoDb, CosmosDb, Cassandra или кеш Redis, то там сразу
можно создавать записть с отметкой TTL и указывать сколько времени запись будет актуальна.
Впоследствии эту отметку можно продлить или сделать живщуей вечно.
По поводу реляционок типа Postgres.
В хранении ненужных записей я не вижу проблемы до тех пор пока вы в состоянии такие
токены идентифицировать и почистить отдельно с помощью джоба который запускается
раз в сутки например и просто удяляет их по признаку например "состояние ожидания
ввода числа из СМС". Трекайте это состояние и все будет ОК.
У записи в БД есть отметка времени создания. В кроне/планировщике создается задача на запуск скрипта раз в сутки для очистки устаревших записей.
- Это единственный эффективный вариант или есть еще какие то?
- 1ncludeX, в общем случае да, запускается скрипт/программа, ищет устаревшие записи и удаляет их, иногда скрипт учитывает нагрузку и ждет пока она не снизится или удаляет данные частями
- 1ncludeX, можно ещё для таких объектов использовать другую СУБД.
Например redis - у него даже встроенная поддержка TTL у записей есть.Но если не хочется множить сущности или нагрузка на сильно большая - вполне можно забить.
- Эффективный по каким критериям? И какие еще могут быть варианты, если задача "удалить записи соответствующие такому-то критерию"? Ну, разве что, если БД сама поддерживает в записи поле "expire" или что-то типа такого. Само собой надо выбрать данные записи и удалить их. Либо реализуется в самом приложении либо скриптом, запускаемым каким-то планировщиком. Вот стратегия удаления может быть разная - как уже сказали проверка на нагрузку и удаление пачками по сколько-то записей. Многое зависит от самого проекта, БД, характеристики данных и прочего. Все проекты уникальны.
- а зачем их удалять? попытки логина это аналитика для менеджеров и безопасности
В дальнейшем это повысит нагрузку на бд при поиске записей.
Когда записей будет под миллион, запустите 1 раз удаление старых неактивированных аккаунтов и выиграете еще аж 500 (а может даже 5тыщь!) записей, это сильно поможет...
В дальнейшем это повысит нагрузку на бд при поиске записей.
БД — это не массив, а СУБД — не процедура поиска полным перебором, написанная школьником. Поэтому можно (нужно?) смотреть планы выполнения запросов, создавать индексы...
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для избавления от ненужных записей в базе данных (БД) можно воспользоваться несколькими методами, в зависимости от того, что именно вы считаете ненужным и какая БД вы используете. Ниже приведены некоторые общие подходы:
1. Удаление записей:
Один из самых простых способов избавиться от ненужных записей - это удалить их из таблицы. Для этого используется SQL-запрос DELETE. Например, если у вас есть таблица "users" и вы хотите удалить всех пользователей, зарегистрированных более года назад, вы можете выполнить следующий запрос:
DELETE FROM users WHERE registration_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);
2. Очистка устаревших данных:
Если у вас есть данные, которые больше не актуальны, но вы все еще храните их для истории или аналитики, можно регулярно переносить их в архивные таблицы или файлы. Это позволит вам освободить место в основной таблице.
3. Оптимизация запросов:
Иногда ненужные записи могут появляться из-за неоптимальных запросов к БД. Пересмотрите свои запросы и убедитесь, что они эффективно выбирают только необходимые данные. Избегайте использования оператора SELECT *, так как он выбирает все столбцы, что может привести к избыточным данным.
4. Использование каскадного удаления:
Если у вас есть связанные таблицы, где записи зависят от других записей, вы можете настроить каскадное удаление, чтобы при удалении основной записи также удалялись все зависимые записи. Это предотвратит появление "висячих" записей.
5. Регулярная очистка:
Создайте расписание для регулярной очистки устаревших или ненужных данных. Например, вы можете установить еженедельную задачу на удаление всех логов старше месяца.
6. Резервное копирование и восстановление:
Прежде чем удалять данные, убедитесь, что у вас есть резервная копия. Это позволит вам восстановить данные, если что-то пойдет не так.
Используя вышеперечисленные методы, вы сможете эффективно избавляться от ненужных записей в вашей базе данных и поддерживать ее в хорошем состоянии.