54 votes

Comment utiliser EXPLAIN pour * prédire * les performances d'une requête MySQL?

Je suis en aidant à maintenir un programme qui est essentiellement une sympathique lecture seule front-end pour un grand complexe de base de données MySQL -- le programme s'appuie ad-hoc de SÉLECTIONNER les requêtes des utilisateurs' entrée, envoie des requêtes à la DB, obtient les résultats, post-processus, et les affiche bien à l'utilisateur.

Je tiens à ajouter une certaine forme de raisonnable/heuristique de prédiction pour la construction de la requête de performance attendus, parfois les utilisateurs, par inadvertance, d'effectuer des requêtes qui vont inévitablement se prendre un temps très long (parce qu'ils vont revenir d'énormes ensembles de résultats, ou parce qu'ils sont "contre-courant" de la façon la DB est indexé) et je voudrais être en mesure de présenter à l'utilisateur une certaine "peu fiable" information/deviner combien de temps la requête va prendre. Il n'a pas à être parfait, tant qu'il n'est pas si mal et souvent collent pas avec la réalité à cause d'un "cry wolf" effet où les utilisateurs à apprendre à les ignorer;-) Basé sur cette information, un utilisateur peut décider d'aller prendre un café (si l'estimation est de 5 à 10 minutes), aller pour le déjeuner (si c'est 30 à 60 minutes), de tuer la requête et d'essayer quelque chose d'autre à la place (peut-être à des limites plus rigoureuses sur l'info qu'ils sont de demander), etc, etc.

Je ne suis pas très familier avec MySQL EXPLIQUER déclaration, je vois que beaucoup d'informations sur la façon de l'utiliser pour optimiser une requête ou d'une DB du schéma, indexation, etc, mais pas beaucoup sur la façon de l'utiliser pour mon plus limitée but -- simplement faire une prédiction, en prenant la DB comme une donnée (bien sûr, si les prédictions sont assez fiable je peut éventuellement passer à l'aide aussi à choisir entre des formes alternatives d'une requête pourrait prendre, mais c'est pour l'avenir: pour l'instant, je serais beaucoup heureux juste pour montrer les performances d'estimation pour les utilisateurs pour les fins mentionnées ci-dessus).

Tous les pointeurs...?

22voto

Greg Points 132247

EXPLIQUER ne vais pas vous donner une indication de combien de temps une requête. Au mieux, vous pouvez l'utiliser pour deviner lequel des deux requêtes peut-être plus rapide, mais moins que l'un d'entre eux est évidemment mal écrit alors même que va être très dur.

Vous devriez aussi être conscient que si vous êtes à l'aide de sous-requêtes, même en cours d'exécution EXPLIQUER peut être lent (presque aussi lent que la requête elle-même dans certains cas).

Pour autant que je suis au courant, MySQL ne fournit aucun moyen d'estimer le temps d'une requête à exécuter. Pourriez-vous journal le temps chaque requête à exécuter, puis construire une estimation basée sur l'historique des requêtes semblables?

11voto

chaos Points 69029

Je pense que si vous voulez avoir une chance de construire quelque chose de raisonnablement fiable à partir de cela, vous devriez construire un modèle statistique à partir de la taille des tables et des composants de résultat EXPLAIN décomposés en corrélation avec les temps de traitement des requêtes. Essayer de construire un prédicteur de temps d'exécution de requête basé sur la réflexion sur le contenu d'un EXPLAIN va simplement passer beaucoup trop de temps à donner des résultats embarrassants avant qu'il ne devienne trop vague.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X