2009-10-28 5 views
2

Nitpicker Question:vérification rapide de l'existence d'une entrée dans une base de données SQL

J'aime avoir une fonction renvoyant une valeur booléenne pour vérifier si une table a une entrée ou non. Et j'ai besoin d'appeler cela beaucoup, donc une optimisation est nécessaire.

SEUI mysql pour l'instant, mais devrait être assez basique ...

Alors dois-je utiliser

select id from table where a=b limit 1; 

ou

select count(*) as cnt from table where a=b; 

ou quelque chose complètement différent?

Je pense que SELECT avec limite devrait s'arrêter après la première recherche, count (*) doit vérifier toutes les entrées. Donc, SELECT pourrait être plus rapide.

Simnplest chose ferait quelques boucle et le tester, mais mes tests ne sont pas utiles. (Mon système de test semble être utilisé par ailleurs, ce qui a dilué mny résultats)

+0

Vous voulez être sûr qu'il y a un index sur 'a' dans les deux cas. –

+0

@Brett: Vraiment pas assez d'infos pour le dire. Si 'a' est une constante énumérée avec 3 valeurs possibles, un index dessus n'augmenterait pas la performance. – Andomar

Répondre

1

La limite 1 demandera à MySQL d'arrêter de chercher après avoir trouvé une ligne. S'il peut y avoir plusieurs lignes correspondant aux critères, c'est plus rapide que count (*).

Il existe d'autres façons d'optimiser cela, mais la nature exacte dépend de la quantité de lignes et de la propagation de a et b. J'irais avec l'approche «où a = b» jusqu'à ce que vous rencontriez des problèmes de performance. Les bases de données sont souvent si rapides que la plupart des requêtes ne posent aucun problème de performance.

3

ce "besoin" est souvent indicatif d'une situation où vous essayez d'INSERT ou UPDATE. Les deux situations les plus courantes sont le chargement/la mise à jour en masse de lignes ou le comptage de hits.

La vérification de l'existence d'une ligne peut d'abord être évitée en utilisant l'instruction INSERT ... ON DUPLICATE KEY UPDATE. pour un compteur d'accès, une seule instruction est nécessaire. Pour le chargement en bloc, chargez les données dans une table temporaire, puis utilisez INSERT ... ON DUPLICATE KEY UPDATE en utilisant la table temporaire comme source.

mais si vous ne pouvez pas l'utiliser, alors le moyen le plus rapide sera select id from table where a=b limit 1; avec force index pour vous assurer que mysql ne regarde que l'index.

+0

+1 L'utilisation d'une instruction a l'avantage d'être transactionnelle. Si vous vérifiez l'existence dans un SELECT séparé, la ligne pourrait être ajoutée entre votre SELECT et INSERT. – Andomar

+0

Un bon conseil pour SQL simple, mais j'utilise un orm qui ne fait pas unique pour mon besoin, donc je devais le faire dans la logique de l'application moi-même. Et le semble ne pas avoir de contrôle sur l'existence non plus. Donc, c'est une bonne réponse, même si ce n'est pas celui que j'espérais. – WegDamit

+0

a mis à jour ma réponse. – longneck

Questions connexes