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)
dEĞİL İÇİNDE kullanarak yalnızca bir anahtarı kontrol bile, bunu yapmanın en iyi yöntem değildir: sen var kullanmalıdır. Bunun nedeni, DEĞİŞTİRMEYİ kullanmazsanız, DBMS'nin yalnızca gerekli sütunlar için indeksler varsa indeksleri kontrol etmesi yeterli olacaktır. Burada, NOT IN için gerçek verileri okumak ve daha sonra kontrol edilmesi gereken bir tam sonuç kümesi oluşturmak zorunda kalacaksınız. .
LEFT JOIN kullanma ve sonra NULL'u kontrol etme de kötü bir fikirdir, tabloların tüm birleştirmeyi yapması gerektiğinden, tabloların büyük olması nedeniyle ağrısal olarak yavaş olacaktır, her iki tablonun tamamını okumalı ve sonradan bir çok şeyi atmalıdır. o. Ayrıca, sütunlar NULL için NULL değerleri için izin verirse, yanlış pozitif bildirir.
Biliyor musun? Bu sorguyu çalıştırdım ve uzun bir zaman alıyordu (10 dakikadan uzun), bu yüzden onu öldürdüm. Sonra iki tablo için temp tabloları oluşturdum ve farklı bilgiler ekledim. Ardından geçici tablolara karşı sorguyu çalıştırdım. Bir dakika ve 4 saniye sürdü. Neden bu sorguyu mysql bu şekilde optimize edemedi? – user151841
Dürüst olmak gerekirse, mysql bazı konularda oldukça aptal ve yavaştır. Oracle, MS SQL ve PostgreSQL birçok açıdan çok daha iyi. Tabii ki, eğer tabloları zaten yoksa, tabloların sütunlarına indeksler eklerseniz çok daha hızlı olacaktır. Bu, indekslerin her seferinde güncellenmesi gerektiğinden, ekleme zamanı maliyetine katlanmasına rağmen, her bir işlemin kaç kez yapıldığını ve daha fazla zaman kritik olan bir meseledir. – wich