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 la surcharge de la requête. J'aime faire une requête SQL complexe, personnellement, mais j'ai trouvé que la taille des tables, le cache de requêtes mysql et les performances de requête des requêtes qui ont besoin de vérifier la distance (même par rapport à un index) font toutes la différence.
Je propose ceci:
1) Établir simple, la ligne de base correcte. Je pense que c'est l'approche de zillion-query. Ce n'est pas faux, et très vraisemblablement correct. Exécutez-le plusieurs fois et observez le cache de vos requêtes et les performances de vos applications. La possibilité de maintenir votre application à portée de main est très importante, surtout si vous travaillez avec d'autres responsables du code. En outre, si vous interrogez des tables très volumineuses, les petites requêtes maintiendront l'évolutivité.
2) Code de la requête complexe. Comparez les résultats pour la précision, puis l'heure. Utilisez ensuite EXPECT sur la requête pour voir quelles sont les lignes analysées. J'ai souvent constaté que si j'ai un JOIN, ou un WHERE x! = Y, ou une condition qui crée une table temporaire, les performances de la requête pourraient être très mauvaises, surtout si je suis dans une table qui est toujours mise à jour. Cependant, j'ai également constaté qu'une requête complexe peut ne pas être correcte, et qu'une requête complexe peut être plus facilement interrompue à mesure qu'une application se développe. Les requêtes complexes analysent généralement des ensembles de lignes plus importants, créant souvent des tables temporaires et appelant des analyses using where
. Plus la table est grande, plus ils sont chers. En outre, vous pouvez avoir des considérations d'équipe lorsque des requêtes complexes ne correspondent pas aux points forts de votre équipe.
3) Partagez les résultats avec votre équipe.
Les requêtes complexes sont moins susceptibles de toucher le cache de requête mysql, et si elles sont assez grandes, ne les cachez pas. (Vous voulez enregistrer le cache de requête mysql pour les requêtes fréquemment rencontrées.) De plus, interrogez les prédicats qui doivent balayer l'index. (x! = y, x> y, x < y). Des requêtes comme SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360'
finissent par faire des scans. (Le coût du surdébit de requête peut être négligeable dans ce cas.)
Les petites requêtes peuvent souvent aboutir sans créer de tables temporaires en obtenant toutes les valeurs de l'index, à condition que les champs que vous sélectionnez et que vous prédiciez soient indexés . 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 (si approprié), ou en effectuant des tâches par lots d'une requête de vue matérialisée. En outre, considérez memcached ou certaines fonctionnalités trouvées dans XCache.
Merci! Je m'en doutais autant. Pourriez-vous donner une idée de * pourquoi * c'est mieux cependant, par exemple à cause des frais généraux de connexion? Je voudrais avoir une meilleure compréhension de comment exactement une façon est meilleure. – anschauung
La CPU et la mémoire sont toujours moins coûteuses que n'importe quelle forme d'E/S, y compris les E/S réseau. Pensez-y comme ceci: il est certainement moins cher d'envoyer une seule commande pour 500 livres et de les recevoir dans un paquet énorme par la poste, que d'envoyer 500 commandes et de recevoir tous les livres dans un emballage séparé. :) –