MySQL
Vous obtiendrez les meilleures performances si vous oubliez la clause where et placez toutes les conditions dans l'expression ON.
Je pense que c'est parce que la requête doit d'abord rejoindre les tables, puis exécute la clause where à ce sujet, donc si vous pouvez réduire ce qui est nécessaire pour rejoindre, c'est la manière rapide d'obtenir les résultats / faire la mise à jour.
Exemple
Scénario
Vous avez une table d'utilisateurs. Ils peuvent se connecter en utilisant leur nom d'utilisateur ou leur adresse e-mail ou leur numéro de compte. Ces comptes peuvent être actifs (1) ou inactifs (0). Ce tableau comporte 50000 lignes
Vous avez ensuite un tableau d'utilisateurs à désactiver en une seule fois, car vous découvrez qu'ils ont tous fait quelque chose de mal. Ce tableau contient cependant une colonne avec des noms d'utilisateur, des e-mails et des numéros de compte mélangés. Il a également un indicateur "has_run" qui doit être mis à 1 (vrai) quand il a été exécuté
Requete
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;
Raisonnement
Si nous devions nous joindre uniquement aux conditions OU, il faudrait essentiellement vérifier chaque ligne 4 fois pour voir si elle devait se joindre, et potentiellement renvoyer beaucoup plus de lignes. Cependant, en lui donnant plus de conditions, il peut "sauter" beaucoup de lignes si elles ne remplissent pas toutes les conditions lors de la jonction.
Prime
C'est plus lisible. Toutes les conditions sont au même endroit et les lignes à mettre à jour sont au même endroit