2010-04-14 7 views
2

Supposons que vous souhaitiez obtenir un enregistrement de la base de données qui renvoie une grande quantité de données et nécessite plusieurs jointures. Donc, ma question serait, est-il préférable d'utiliser une seule requête pour vérifier si les données existent et obtenir le résultat si elle existe? Ou faites une requête plus simple pour vérifier si les données existent puis l'enregistrement de l'ID existe, interrogez-vous à nouveau pour obtenir le résultat sachant qu'il existe.Vérifier si les enregistrements existent dans DB: en une seule étape ou en deux étapes?

Exemple:

3 tables a, b et ab (table de jonction)

select * from 
from a, b, ab 
where condition 
and condition 
and condition 
and condition etc... 

ou

select id 
from a, b ab 
where condition 

alors si la requête existe faire ci-dessus. Donc, je ne sais pas s'il y a une raison de faire la seconde. Des idées comment cela affecte les performances de DB ou est-ce important?

Répondre

3

Généralement, la partie la plus lente d'une requête est le filtre, puis la recherche indexée, les jointures, etc. S'il s'agit de beaucoup de données à transférer, le transfert prend également beaucoup de temps. Ce sera deux fois plus lent si vous vérifiez l'existence puis extrayez les données. Juste extraire les données. Si c'est le cas, vous l'obtenez, et sinon - vous n'obtenez rien.

Lors de l'extraction à partir de plusieurs tables, JOIN est plus rapide et plus flexible.

0

Une autre remarque à prendre en compte si vous êtes préoccupé par le temps d'exécution. Évitez d'utiliser '*' dans l'instruction select. Il peut s'agir d'une simple note mais elle affecte directement l'exécution de la requête. Mettez à jour l'instruction select, utilisez des alias, indexez les clés u'r et sélectionnez uniquement les champs nécessaires.

1

Je préfère généralement l'approche «deux requêtes» lorsque les résultats doivent être paginés ou mis en cache. Par exemple:

$found_ids = "select id from products where ...complex $condition...." 

maybe add to cache ($condition => $found_ids) 

$ids_to_show = array_slice($found_ids, $_GET['page'], $pagesize); 

$data = "select * from products, more tables ... where products.id IN($ids_to_show)"; 

Depuis la première requête peut retourner une liste potentiellement longue ids, ce serait une perte de temps tout à fait pour extraire des données pour tous.

Questions connexes