Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélectionnez la ligne parent uniquement si elle n'a pas d'enfants

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

tu peux le faire. la jointure externe devrait apporter un peu de performance, mais pas beaucoup.

les nouveaux systèmes de base de données optimiseront probablement votre requête de toute façon afin qu'il n'y ait aucune différence.

la bonne façon ici est la mise en cache ! essayez le cache de requête et la mise en cache au niveau de l'application si possible.

bien sûr, vous avez besoin d'index appropriés.

et par bon je veux dire sur les deux tables et de préférence un index de hachage car il aura un temps de recherche statique par rapport à n'importe quel arbre qui a logarithmique

Essayez de mettre une explication avant la requête pour voir ce qui ralentit vraiment cela.

si vous avez vraiment besoin que cela soit rapide, vous pouvez restructurer votre structure de données.

vous pouvez éventuellement créer un déclencheur pour marquer un indicateur dans la table A s'il existe une entrée correspondante dans la table be. bien sûr cette redondance des données d'identification, mais parfois ça vaut le coup. considérez-le simplement comme une mise en cache.

une dernière réflexion :vous pouvez essayer SELECT id FROM A WHERE id NOT IN (SELECT id FROM B) cela peut être un peu plus rapide parce qu'aucune jointure réelle n'est nécessaire, mais cela peut aussi être plus lent parce que la recherche dans l'ensemble de be sera une analyse complète. Je ne sais pas vraiment comment cela sera traité, mais cela vaut peut-être la peine d'essayer.