Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Selecione a linha pai apenas se não tiver filhos

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

você consegue fazer isso. a junção externa deve trazer um pouco de desempenho, mas não muito.

novos sistemas de banco de dados provavelmente otimizarão sua consulta de qualquer maneira para que não haja nenhuma diferença.

a maneira correta aqui é cache! tente o cache de consulta e o cache de nível de aplicativo, se possível.

é claro que você precisa de índices adequados.

e por apropriado quero dizer em ambas as tabelas e de preferência um índice de hash, pois terá tempo de pesquisa estático em comparação com qualquer árvore que tenha logarítmica

Tente colocar uma explicação antes da consulta para ver o que realmente diminui isso.

se você realmente precisa que isso seja rápido, você pode reformular sua estrutura de dados.

você poderia criar um gatilho para marcar um sinalizador na tabela A se houver uma entrada correspondente na tabela ser. é claro que essa redundância de dados de identificação, mas às vezes vale a pena. apenas pense nisso como cache.

um último pensamento:você pode tentar SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) pode ser um pouco mais rápido porque nenhuma junção real é necessária, mas também pode ser mais lenta porque a pesquisa no conjunto de be será uma varredura completa. Não tenho certeza de como isso será processado, mas pode valer a pena tentar.