Nie powinieneś używać:
SELECT DISTINCT a, b, c FROM t1 WHERE NOT EXISTS (SELECT NULL FROM t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)
Używanie NOT IN nie jest najlepszą metodą, nawet jeśli zaznaczysz tylko jeden klucz. Powodem jest to, że jeśli użyjesz NOT EXISTS, DBMS będzie musiał tylko sprawdzić indeksy, jeśli istnieją indeksy dla potrzebnych kolumn, gdzie tak jak dla NOT IN będzie musiał odczytać rzeczywiste dane i utworzyć pełny zestaw wyników, który następnie musi zostać sprawdzony .
Używanie LEWEGO DOŁĄCZENIA, a następnie sprawdzanie NULL jest również złym pomysłem, będzie boleśnie powolne, gdy tabele są duże, ponieważ zapytanie musi wykonać całe sprzężenie, odczytanie obu tabel w pełni, a następnie wyrzucenie dużej ilości to. Ponadto, jeśli kolumny pozwalają na wartości NULL, sprawdzenie wartości NULL spowoduje zgłoszenie wyników fałszywie dodatnich.
Wiesz co? Uruchomiłem to zapytanie i trwało to dużo czasu (dłużej niż 10 minut), więc je zabiłem. Następnie ustawiłem tabele tymczasowe dla dwóch tabel i wstawiłem różne informacje. Następnie uruchomiłem kwerendę względem tabel tymczasowych. Zajęło minutę i 4 sekundy. Dlaczego w ten sposób mysql nie mógł zoptymalizować tego zapytania? – user151841
Szczerze mówiąc, mysql jest pod pewnymi względami dość głupi i powolny. Oracle, MS SQL i PostgreSQL radzą sobie znacznie lepiej pod wieloma względami. Oczywiście będzie to o wiele szybsze, jeśli dodasz indeksy do kolumn tabel, jeśli jeszcze ich nie masz. chociaż kosztem czasu włożenia, ponieważ indeksy muszą być aktualizowane za każdym razem, to kwestia tego, ile razy wykonujesz każdą operację i która jest bardziej krytyczna. – wich