sql >> Databáze >  >> RDS >> Mysql

Nadřazený řádek vyberte pouze v případě, že nemá žádné potomky

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

můžeš to udělat. vnější spojení by mělo přinést malý výkon, ale ne moc.

nové databázové systémy pravděpodobně váš dotaz stejně optimalizují, takže v tom nebude žádný rozdíl.

správným způsobem je zde ukládání do mezipaměti! vyzkoušejte cacher dotazů a ukládání do mezipaměti na úrovni aplikace, pokud je to možné.

samozřejmě potřebujete správné indexy.

a správně myslím na obou tabulkách a nejlépe hash index, protože bude mít čas statického vyhledávání ve srovnání s jakýmkoli stromem, který má logaritmický

Zkuste před dotaz vložit vysvětlení, abyste viděli, co to skutečně zpomaluje.

pokud opravdu potřebujete, aby to bylo rychlé, můžete svou datovou strukturu znovu vyrobit.

můžete případně vytvořit spouštěč pro označení příznaku v tabulce A, zda existuje odpovídající záznam v tabulce be. samozřejmě tato redundance ID dat, ale někdy to stojí za to. prostě to berte jako ukládání do mezipaměti.

poslední myšlenka:můžete zkusit SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) může být o něco rychlejší, protože není nutné žádné skutečné spojení, ale může být také pomalejší, protože vyhledávání v sadě be bude úplné skenování. Nejsem si jistý, jak to bude zpracováno, ale možná to stojí za pokus.



  1. Je BLOB převeden pomocí aktuální/výchozí znakové sady v MySQL?

  2. MySQL:proč varchar(254) a ne varchar(255)?

  3. Jak udělit všechna oprávnění k databázi v MySQL

  4. Rychlé rozdělení na oddíly