Как удалить записи из базы данных MySQL, оставив только те, у которых id не входит в список из более чем 7000 значений?

Как эффективно удалить лишние id серверов из базы данных, когда у вас их 7000, а в базе их около 10000 и более? Нужно ли использовать конструкцию WHERE guildid not in(...,...,...,...) или есть более оптимальные способы очистки базы данных от лишних записей?
  • 12 июня 2024 г. 15:31
Ответы на вопрос 3
Для удаления записей из базы данных MySQL, оставив только те, у которых id не входит в список из более чем 7000 значений, можно воспользоваться конструкцией WHERE NOT IN. 

Пример запроса:
```
DELETE FROM table_name
WHERE id NOT IN (list_of_7000_values)
```

Если у вас более 7000 лишних id серверов, их можно сохранить во временной таблице или файле, а затем использовать этот список значений в запросе DELETE с использованием NOT IN.

Следует отметить, что при выполнении DELETE операции на больших объемах данных может потребоваться время. В таких случаях рекомендуется использовать индексы на столбцах, по которым происходит поиск, чтобы ускорить выполнение запроса.

Таким образом, использование конструкции WHERE NOT IN с подходящими индексами может быть оптимальным способом удаления лишних записей из базы данных MySQL.
Тебе нужно эти id загрузить во временную табличку и сделать этот запрос 

delete from tab1 where WHERE guildid not in (select id from temp_table)
Тебе все ответили, тут два варианта - создавать в базе inmemory таблицу с одной колонкой и без индексов, и на ее основе уже делать 
DELETE FROM A WHERE A.id NOT IN (SELECT id FROM B);


Либо написать скрипт, который выгрузит все id из базы, сравнит их (пока чисел не миллионы, это вообще не проблема) и сформирует список id которые нужно удалить (если всего 10к то их будет всего 3к), когда на десяток строк в любом языке программирования. Так как удаляются конкретные id то такой запрос будет работать быстрее чем delete where not in и возможно быстрее использования временной таблицы. Особых ограничений на количество id в where id in (...) я не нашел, если они есть то это проблема драйвера подключения к бд.

Есть еще третий вариант, который потребует изменения всего проекта, но заложит неплохие возможности. В базе данных нужно определить флаг - deleted (boolean), который устанавливать true если запись нужно удалить, это может быть дополнительное поле в каждой таблице где это имеет смысл, либо отдельная таблица (это эффективнее, если удаленные записи долго не нужно хранить) с единственным полем id, куда будут складываться идентификаторы записей на удаление. Естественно все запросы проекта нужно будет модифицировать с учетом этого поля/таблицы, чтобы пропускались записи, помеченные на удаление. Реальное же удаление проводить в момент наименьшей нагрузки на сервер или по другому критерию (например удаленные записи можно хранить для использования, к примеру отчетности). У метода есть подводные камни - например уникальные индексы/ограничения на другие поля нужно так же переделывать на сдвоенные с флагом удаленности, чтобы допускались записи с тем же значением что и удаленные.
Похожие вопросы