MySQL
Anda akan mendapatkan kinerja terbaik jika Anda lupa di mana klausa dan menempatkan semua kondisi dalam ekspresi ON.
Saya pikir ini karena permintaan pertama harus bergabung dengan tabel kemudian menjalankan klausa di mana itu, jadi jika Anda dapat mengurangi apa yang diperlukan untuk bergabung maka itulah cara berpuasa untuk mendapatkan hasil / melakukan udpate.
Contoh
Skenario
Anda memiliki tabel pengguna. Mereka dapat masuk menggunakan nama pengguna atau email atau nomor akun mereka. Akun-akun ini bisa aktif (1) atau tidak aktif (0). Tabel ini memiliki 50.000 baris
Anda kemudian memiliki tabel pengguna untuk menonaktifkan sekaligus karena Anda tahu mereka semua telah melakukan sesuatu yang buruk. Namun tabel ini, memiliki satu kolom dengan nama pengguna, email, dan nomor akun dicampur. Ini juga memiliki indikator "has_run" yang perlu diatur ke 1 (benar) ketika telah dijalankan
Pertanyaan
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;
Pemikiran
Jika kita harus bergabung hanya pada kondisi ATAU itu pada dasarnya perlu memeriksa setiap baris 4 kali untuk melihat apakah harus bergabung, dan berpotensi menghasilkan lebih banyak baris. Namun, dengan memberikan lebih banyak persyaratan, ia dapat "melewati" banyak baris jika tidak memenuhi semua persyaratan saat bergabung.
Bonus
Ini lebih mudah dibaca. Semua kondisi di satu tempat dan baris untuk memperbarui ada di satu tempat