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

Vælg kun overordnet række, hvis den ikke har nogen underordnede

SELECT id FROM A LEFT OUTER JOIN B ON A.id=B.id WHERE B.id IS NULL

Du kan gøre det. den ydre sammenføjning skulle give lidt ydeevne, men ikke meget.

nye databasesystemer vil sandsynligvis optimere din forespørgsel alligevel, så der ikke er nogen forskel.

den korrekte måde her er caching! prøv forespørgselscacheren og cachelagring på applikationsniveau, hvis det er muligt.

selvfølgelig har du brug for ordentlige indekser.

og med korrekt mener jeg på begge tabeller og helst et hash-indeks, da det vil have statisk opslagstid sammenlignet med ethvert træ, der har logaritmisk

Prøv at sætte en forklaring før forespørgslen for at se, hvad der virkelig bremser dette.

hvis du virkelig har brug for, at dette er hurtigt, kan du omstrukturere din datastruktur.

du kunne eventuelt oprette en trigger for at markere et flag i tabel A, om der er en tilsvarende post i tabel være. selvfølgelig denne id-dataredundans, men nogle gange er det det værd. tænk bare på det som caching.

en sidste tanke:du kan prøve SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) det kan være lidt hurtigere, fordi ingen egentlig sammenføjning er nødvendig, men det kan også være langsommere, fordi opslaget i sættet af be vil være en fuld scanning. Jeg er ikke rigtig sikker på, hvordan dette vil blive behandlet, men det kan være et forsøg værd.



  1. Resultatcache

  2. Hent rækker grupperet efter time med MySQL

  3. Bestem, om der findes en kombination af mange-til-mange poster

  4. MySQL:VÆLG fra en anden server