Эффективное удаление строк из одной таблицы, не совпадающих с другой [MySQL] - PullRequest
1 голос
/ 29 мая 2020

Итак, у меня есть две таблицы, пользователи и точки. У многих пользователей больше нет баллов (буквально и по таблице), поэтому я sh их удаляю. Я пытаюсь добиться этого, делая это, но в основном это время истекает (около ста тысяч строк в обеих таблицах). Я делаю выбор, а не удаление, потому что хочу проверить данные перед тем, как выдать тот же запрос, что и удаление:

SELECT WWW t1 
FROM users t1
JOIN points t2 ON t1.id != t2.user_id;

Обе таблицы имеют совпадающие друг с другом идентификаторы. Если у пользователя есть точка, будет соответствующий идентификатор. Если для этого пользователя больше нет точки, значит нет подходящего идентификатора. Следовательно,! = Теоретически следует удалить всех больше не нужных пользователей.

Как я могу сделать это без тайм-аута моей базы данных?

1 Ответ

2 голосов
/ 29 мая 2020

Я бы порекомендовал not exists:

delete from users
where not exists (select 1 from points p where p.user_id = users.id)

Это должно быть эффективным вариантом, если у вас есть правильный индекс, то есть: points(user_id).

На С другой стороны, если вы удаляете большую часть таблицы, было бы проще переместить те строки, которые вы хотите сохранить, во временную таблицу, а затем усечь и воссоздать таблицу:

create table tmp_users as 
select u.*
from users
where exists(select 1 from points p where p.user_id = u.id)

truncate table users;  -- back it up first!

insert into users select * from tmp_users;

drop table tmp_users;
...