Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wybierz wiersz nadrzędny tylko wtedy, gdy nie ma w nim dzieci

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

możesz to zrobić. sprzężenie zewnętrzne powinno zapewnić niewielką wydajność, ale niewiele.

nowe systemy baz danych prawdopodobnie i tak zoptymalizują Twoje zapytanie, więc nie będzie żadnej różnicy.

prawidłowym sposobem jest buforowanie! spróbuj bufora zapytań i buforowania na poziomie aplikacji, jeśli to możliwe.

oczywiście potrzebujesz odpowiednich indeksów.

i przez właściwe mam na myśli obie tabele, a najlepiej indeks skrótu, ponieważ będzie miał statyczny czas wyszukiwania w porównaniu do dowolnego drzewa, które ma logarytmiczne

Spróbuj umieścić wyjaśnienie przed zapytaniem, aby zobaczyć, co naprawdę to spowalnia.

jeśli naprawdę potrzebujesz, aby było to szybkie, możesz zmienić strukturę danych.

możesz ewentualnie utworzyć wyzwalacz, aby oznaczyć flagę w tabeli A, niezależnie od tego, czy istnieje odpowiedni wpis w tabeli be. oczywiście ta nadmiarowość danych id, ale czasami warto. po prostu pomyśl o tym jako o buforowaniu.

ostatnia myśl:możesz spróbować SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) może być trochę szybszy, ponieważ nie jest konieczne faktyczne łączenie, ale może być również wolniejszy, ponieważ wyszukiwanie w zestawie be będzie pełnym skanem. Nie jestem do końca pewien, jak to zostanie przetworzone, ale może warto spróbować.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie GROUP_CONCAT w podzapytaniu w MySQL

  2. Nie można wstawić chińskiego znaku do MySQL

  3. MySQL łączy dwie kolumny w jedną kolumnę

  4. Wybierz wszystkie wiersze, które mają przynajmniej listę funkcji

  5. Jak uzyskać listę przedmieść otaczających lokalizację, a następnie powtórzyć dla innych lokalizacji za pomocą MySql?