sql >> Databasteknik >  >> RDS >> Mysql

mysql SELECT NOT IN () -- disjoint set?

Du bör använda inte existerar:

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)

Att använda NOT IN är inte den bästa metoden för att göra detta, även om du bara markerar en nyckel. Anledningen är att om du använder NOT EXISTS kommer DBMS bara att behöva kontrollera index om det finns index för de nödvändiga kolumnerna, där när det gäller NOT IN kommer det att behöva läsa den faktiska datan och skapa en fullständig resultatuppsättning som sedan måste kontrolleras .

Att använda en LEFT JOIN och sedan leta efter NULL är också en dålig idé, det kommer att gå smärtsamt långsamt när tabellerna är stora eftersom frågan måste få hela sammanfogningen, läsa båda tabellerna fullt ut och sedan kasta bort mycket av det. Om kolumnerna tillåter NULL-värden kommer även kontroll av NULL att rapportera falska positiva resultat.



  1. Hämta från databasen men varar bara 30 dagar

  2. Fixa hål/luckor i siffror som genereras av Postgres-sekvensen

  3. MySQLdb.cursor.execute kan inte köra flera frågor

  4. Sammanfoga flera bord utan gemensam nyckel