MySQL
Najlepsze wyniki uzyskasz, jeśli zapomnisz klauzulę where i umieścisz wszystkie warunki w wyrażeniu ON.
Myślę, że dzieje się tak, ponieważ zapytanie najpierw musi dołączyć do tabel, a następnie uruchamia na nim klauzulę where, więc jeśli możesz zmniejszyć liczbę wymaganych elementów do przyłączenia, jest to najszybszy sposób na uzyskanie wyników / wykonanie udpate.
Przykład
Scenariusz
Masz tabelę użytkowników. Mogą zalogować się przy użyciu swojej nazwy użytkownika lub adresu e-mail lub numeru konta. Te konta mogą być aktywne (1) lub nieaktywne (0). Ta tabela ma 50000 wierszy
Następnie masz tabelę użytkowników do wyłączenia za jednym razem, ponieważ dowiadujesz się, że wszyscy zrobili coś złego. Ta tabela ma jednak jedną kolumnę zawierającą nazwy użytkowników, e-maile i numery kont. Ma także wskaźnik „has_run”, który należy ustawić na 1 (prawda) po uruchomieniu
Pytanie
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;
Rozumowanie
Gdybyśmy musieli dołączyć tylko warunki OR, w zasadzie musielibyśmy sprawdzać każdy wiersz 4 razy, aby zobaczyć, czy powinien się połączyć, i potencjalnie zwracać znacznie więcej wierszy. Jednak dając mu więcej warunków, może „pominąć” wiele wierszy, jeśli nie spełniają wszystkich warunków podczas łączenia.
Premia
Jest bardziej czytelny. Wszystkie warunki są w jednym miejscu, a wiersze do aktualizacji są w jednym miejscu