Mysql
 sql >> Database >  >> RDS >> Mysql

mysql SELECT NOT IN () -- set disgiunto?

Dovresti usare non esiste:

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)

L'uso di NOT IN non è il metodo migliore per farlo, anche se si seleziona una sola chiave. Il motivo è che se usi NOT EXISTS il DBMS dovrà solo controllare gli indici se esistono indici per le colonne necessarie, mentre come per NOT IN dovrà leggere i dati effettivi e creare un set di risultati completo che successivamente deve essere verificato .

Anche l'uso di un LEFT JOIN e quindi il controllo di NULL è una cattiva idea, sarà dolorosamente lento quando le tabelle sono grandi poiché la query deve eseguire l'intero join, leggendo entrambe le tabelle completamente e successivamente eliminandone molto. Inoltre, se le colonne consentono valori NULL, il controllo di NULL riporterà falsi positivi.