MySQL
Вы получите наилучшую производительность, если забудете предложение where и поместите все условия в выражение ON.
Я думаю, это потому, что запрос сначала должен объединить таблицы, а затем выполнить предложение where, поэтому, если вы можете уменьшить то, что требуется для объединения, это быстрый способ получить результаты / выполнить обновление.
пример
сценарий
У вас есть таблица пользователей. Они могут войти в систему, используя свое имя пользователя или адрес электронной почты или account_number. Эти учетные записи могут быть активными (1) или неактивными (0). Эта таблица имеет 50000 строк
Затем у вас есть таблица пользователей, которую нужно отключить за один раз, потому что вы обнаружите, что они все сделали что-то плохое. Эта таблица, однако, имеет один столбец со смешанными именами пользователей, адресами электронной почты и номерами счетов. Он также имеет индикатор has_run, который должен быть установлен в 1 (true), когда он был запущен
запрос
UPDATE users User
INNER JOIN
blacklist_users BlacklistUser
ON
(
User.username = BlacklistUser.account_ref
OR
User.email = BlacklistedUser.account_ref
OR
User.phone_number = BlacklistUser.account_ref
AND
User.is_active = 1
AND
BlacklistUser.has_run = 0
)
SET
User.is_active = 0,
BlacklistUser.has_run = 1;
аргументация
Если бы нам пришлось присоединиться только к условиям ИЛИ, по сути, нужно было бы проверить каждую строку 4 раза, чтобы увидеть, должно ли оно присоединиться, и потенциально вернуть намного больше строк. Однако, предоставляя ему больше условий, он может «пропустить» много строк, если они не удовлетворяют всем условиям при соединении.
бонус
Это более читабельно. Все условия находятся в одном месте, а строки для обновления - в одном месте