sql >> Databasteknik >  >> RDS >> Mysql

Välj endast överordnad rad om den inte har några underordnade

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

du kan göra det här. den yttre sammanfogningen bör ge lite prestanda, men inte mycket.

nya databassystem kommer förmodligen att optimera din fråga ändå så att det inte blir någon skillnad.

det korrekta sättet här är cachning! prova frågecachern och cachelagring på programnivå om möjligt.

självklart behöver du ordentliga index.

och med korrekt menar jag på båda tabellerna och helst ett hashindex eftersom det kommer att ha statisk uppslagstid i jämförelse med alla träd som har logaritmisk

Försök att lägga en förklaring före frågan för att se vad som verkligen saktar ner detta.

om du verkligen behöver detta för att vara snabbt kan du omstrukturera din datastruktur.

du kan möjligen skapa en trigger för att markera en flagga i tabell A om det finns en motsvarande post i tabellen vara. naturligtvis denna id-dataredundans, men ibland är det värt det. tänk bara på det som cachning.

en sista tanke:du kan prova SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) det kan vara lite snabbare eftersom ingen faktisk sammanfogning är nödvändig, men det kan också vara långsammare eftersom uppslagningen i uppsättningen av kommer att vara en fullständig genomsökning. Jag är inte riktigt säker på hur detta kommer att bearbetas men det kan vara värt ett försök.



  1. Hur hittar jag MySQL my.cnf-platsen

  2. Hur får man flera poster mot en post baserat på relation?

  3. SQLite kan inte öppna databasfil (kod 14) vid frekvent SELECT-fråga

  4. FLOOR() Funktion i Oracle