MySQL
Sie erzielen die beste Leistung, wenn Sie die where-Klausel vergessen und alle Bedingungen in den ON-Ausdruck einfügen.
Ich denke, das liegt daran, dass die Abfrage zuerst die Tabellen verknüpfen muss und dann die where-Klausel darauf ausführt. Wenn Sie also reduzieren können, was für die Verknüpfung erforderlich ist, ist dies der schnellste Weg, um die Ergebnisse zu erhalten / das udpate auszuführen.
Beispiel
Szenario
Sie haben eine Benutzertabelle. Sie können sich mit ihrem Benutzernamen, ihrer E-Mail-Adresse oder ihrer Kontonummer anmelden. Diese Konten können aktiv (1) oder inaktiv (0) sein. Diese Tabelle enthält 50000 Zeilen
Sie haben dann eine Tabelle mit Benutzern, die Sie auf einmal deaktivieren können, weil Sie herausfinden, dass sie alle etwas Schlechtes getan haben. Diese Tabelle enthält jedoch eine Spalte mit gemischten Benutzernamen, E-Mails und Kontonummern. Es hat auch einen "has_run" Indikator, der auf 1 (true) gesetzt werden muss, wenn es ausgeführt wurde
Abfrage
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;
Argumentation
Wenn wir nur unter den OR-Bedingungen beitreten müssten, müsste im Wesentlichen jede Zeile viermal überprüft werden, um festzustellen, ob sie beitreten sollte, und möglicherweise viel mehr Zeilen zurückgeben. Wenn Sie jedoch mehr Bedingungen festlegen, können viele Zeilen "übersprungen" werden, wenn sie beim Verbinden nicht alle Bedingungen erfüllen.
Bonus
Es ist besser lesbar. Alle Bedingungen befinden sich an einem Ort und die zu aktualisierenden Zeilen befinden sich an einem Ort