Это ваш запрос, верно? И PK id
, правильно?
SELECT l.email
FROM activation_request l
LEFT JOIN user r ON r.username = l.email
WHERE l.date_confirmed is not null
AND r.username IS NULL
Используя некоторый код приложения, создайте al oop на id
, возможно, 10000 за раз:
SELECT l.email
FROM activation_request l
LEFT JOIN user r ON r.username = l.email
WHERE l.date_confirmed is not null
AND r.username IS NULL
AND l.id BETWEEN 1 AND 10000; -- added
Время который; затем измените последнюю строку на
AND l.id BETWEEN 10001 AND 20000;
Et c.
Это будет:
- Предоставить требуемый список строк с пропущенными пользователями, хотя и по частям .
- После первого фрагмента вы можете экстраполировать, чтобы получить ожидаемое общее время.
- После нескольких фрагментов вы можете почувствовать, изменяется ли он по скорости.
- Вы можете сложить данные вместе, чтобы получить индикатор выполнения.
Выше предполагается, что ids
"плотные"; это не идентификаторы удалены. Если есть удаленные идентификаторы, то чанки не будут состоять из 10000 строк (а, скорее, будет меньше строк). Эту проблему можно решить с помощью SELECT id FROM .. WHERE id > $leftoff ORDER BY id .. LIMIT 10000,1
, чтобы определить следующую конечную точку.
Подробнее о чанкинге: http://mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks (Внимание: это говорит об удалении.)
Если вы сделаете несколько фрагментов по методу NOT EXISTS
, вы сможете почувствовать, что быстрее. Предостережение: запустите дважды, чтобы избежать кеширования, которое могло испортить время.