Question

Y at-il une différence de performance appréciable entre avoir une requête SELECT foo, bar, FROM users qui retourne 500 lignes et 500 requêtes SELECT foo, bar, FROM users WHERE id = x venir à la fois?

Dans une application PHP j'écris, je suis en train de choisir entre une écriture section claire, lisible du code qui produirait environ 500 instructions SELECT; ou d'écrire dans une manière complexe obscure, qui utiliserait une seule SELECT qui renvoie 500 lignes.

Je préférerais la manière qui utilise le code clair, maintenable, mais je crains que les frais généraux de connexion pour chacun des SELECTs causera des problèmes de performance.

Infos générales, dans le cas où il est pertinent: 1) Ceci est un module Drupal, codé en PHP 2) Les tableaux en question deviennent très peu et INSERTs Updates, sont rarement verrouillés 3) SQL ne sont pas possibles JOIN pour des raisons non pertinentes à la question

Merci!

Était-ce utile?

La solution

Il est presque toujours plus rapide de faire un gros lot SELECT et analyser les résultats dans votre code d'application que de faire une énorme quantité de SELECTs pour une ligne. Je recommande que vous implémentez les deux et les profils, cependant. Toujours chercher à réduire le nombre d'hypothèses que vous devez faire.

Autres conseils

Je ne vous inquiétez pas au sujet de la surcharge de connexion des requêtes MySQL trop, surtout si vous n'êtes pas fermer la connexion entre chaque requête. Considérez que si votre requête crée une table temporaire, vous avez déjà passé plus de temps dans la requête que les frais généraux de la requête a.

J'adore faire une requête SQL complexe, personnellement, mais je l'ai constaté que la taille des tables, le cache de requêtes MySQL et les performances des requêtes de requêtes qui ont besoin de faire la vérification de gamme (même contre un indice) faire une différence.

Je suggère ceci:

1) établir la simple base correcte. Je soupçonne que c'est l'approche zillion-requête. Ce n'est pas mal, et très probablement helfully correcte. Laisser tourner quelques fois et regarder le cache de votre requête et les performances des applications. La capacité de garder votre application maintenable est très important, surtout si vous travaillez avec d'autres mainteneurs de code. En outre, si vous interrogez les tables vraiment grandes, petites requêtes maintiendront l'évolutivité.

2) Code de la requête complexe. Comparer les résultats pour la précision, puis le temps. Ensuite, utilisez ATTENDRE sur la requête pour voir ce que les lignes sont numérisées. Je l'ai souvent constaté que si je JOIN ou un x WHERE! = Y, ou une condition qui crée une table temporaire, la performance de requête pourrait être assez mauvais, surtout si je suis dans une table qui est toujours obtenir mis à jour. Cependant, je l'ai aussi trouvé qu'une requête complexe pourrait ne pas être correcte, et aussi qu'une requête complexe peut se casser plus facilement une application se développe. Les requêtes complexes balayent généralement plus grands ensembles de lignes, créant souvent des tables temporaires et invoquez scans using where. Plus la table, plus cher ceux-ci obtiennent. , Vous pourriez aussi avoir des considérations d'équipe où des requêtes complexes ne conviennent pas aux forces de votre équipe.

3) Partager les résultats avec votre équipe.

Les requêtes complexes sont moins susceptibles de frapper le cache de requêtes MySQL, et si elles sont assez grandes, ne les cache pas. (Vous voulez enregistrer le cache de requêtes MySQL pour les requêtes fréquemment frappé.) En outre, la requête où prédicats qui doivent balayer l'index ne sera pas faire aussi bien. (X! = Y, x> y, x SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360' finissent par faire des analyses. (Le coût des frais généraux de requête pourrait être négligeable dans ce cas.)

Les petites requêtes peuvent souvent complet sans créer des tables temporaires simplement en obtenant toutes les valeurs de l'indice, tant que les champs vous choisissez et sont indexés sur prédiquer. Ainsi, les performances des requêtes de SELECT foo, bar FROM users WHERE id = x est vraiment super (surtout si les colonnes foo et bar sont indexés comme, alias alter table users add index ix_a ( foo, bar );.)

D'autres bonnes façons d'augmenter les performances de votre application serait de mettre en cache les petits résultats de la requête dans l'application (le cas échéant), ou faire des travaux par lots d'une requête de vue matérialisée. , Voir également memcached ou certaines caractéristiques trouvées dans XCache.

Il semble que vous savez ce que les 500 valeurs de id sont, alors pourquoi ne pas faire quelque chose comme ceci:

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top