MySQL
Otterrai le prestazioni migliori se dimentichi la clausola where e inserisci tutte le condizioni nell'espressione ON.
Penso che ciò sia dovuto al fatto che la query deve prima aderire alle tabelle, quindi esegue la clausola where, quindi se è possibile ridurre ciò che è necessario per unirsi, questo è il modo più veloce per ottenere i risultati / eseguire udpate.
Esempio
Scenario
Hai una tabella di utenti. Possono accedere utilizzando il loro nome utente o e-mail o account_number. Questi account possono essere attivi (1) o inattivi (0). Questa tabella ha 50000 righe
Quindi hai una tabella di utenti da disabilitare in una sola volta perché scopri che hanno tutti fatto qualcosa di brutto. Questa tabella, tuttavia, ha una colonna con nomi utente, e-mail e numeri di account mescolati. Ha anche un indicatore "has_run" che deve essere impostato su 1 (true) quando è stato eseguito
domanda
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;
Ragionamento
Se dovessimo unirci solo alle condizioni OR, essenzialmente dovrebbe controllare ogni riga 4 volte per vedere se dovrebbe unirsi e potenzialmente restituire molte più righe. Tuttavia, dandogli più condizioni, può "saltare" molte righe se non soddisfano tutte le condizioni quando si uniscono.
indennità
È più leggibile. Tutte le condizioni sono in un posto e le righe da aggiornare sono in un posto