MySQL
Ви отримаєте найкращу ефективність, якщо забудете пункт де і розмістите всі умови у виразі ON.
Я думаю, що це тому, що запит спочатку повинен приєднатись до таблиць, а потім запускає пункт де на цьому, тож якщо ви можете зменшити те, що потрібно для приєднання, то це швидкий спосіб отримати результати / зробити udpate.
Приклад
Сценарій
У вас є таблиця користувачів. Вони можуть увійти в систему, використовуючи своє ім’я користувача або електронну пошту чи номер_раху. Ці облікові записи можуть бути активними (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 рази, щоб побачити, чи повинен він приєднуватися, і потенційно повернути набагато більше рядків. Однак, надавши йому більше умов, він може "пропустити" багато рядків, якщо вони не відповідають усім умовам при приєднанні.
Бонус
Це читабельніше. Усі умови знаходяться в одному місці, а рядки для оновлення - в одному місці