MySQL
Where yan tümcesini unutursanız ve tüm koşulları ON ifadesine yerleştirirseniz en iyi performansı elde edersiniz.
Bence sorgu ilk tablolara katılmak zorunda sonra nerede bu maddeyi çalıştırır, bu yüzden katılmak için gerekenleri azaltabilir sonra sonuç almak / udpate yapmak için oruçlu yolu olduğunu düşünüyorum çünkü.
Misal
senaryo
Bir kullanıcı tablonuz var. Kullanıcı adlarını veya e-postalarını veya hesap_numaralarını kullanarak giriş yapabilirler. Bu hesaplar etkin (1) veya etkin değil (0) olabilir. Bu tabloda 50000 satır var
Daha sonra, bir kerede devre dışı bırakacak bir kullanıcı tablonuz var, çünkü hepsinin kötü bir şey yaptığını öğrendiniz. Ancak bu tabloda kullanıcı adları, e-postalar ve hesap numaralarının karıştırıldığı bir sütun vardır. Ayrıca, çalıştırıldığında 1 (true) olarak ayarlanması gereken bir "has_run" göstergesine de sahiptir.
Sorgu
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;
muhakeme
Sadece OR koşullarına katılmak zorunda kalsaydık, birleştirilip birleştirilmeyeceğini görmek için her satırı 4 kez kontrol etmeliyiz ve potansiyel olarak çok daha fazla satır döndürmeliyiz. Bununla birlikte, daha fazla koşul vererek, katılırken tüm koşulları karşılamazlarsa çok sayıda satırı "atlayabilir".
Bonus
Daha okunabilir. Tüm koşullar tek bir yerde ve güncellenecek satırlar tek bir yerde