IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Comment optimiser les temps de réponse d'une requête ?


Sujet :

Requêtes MySQL

  1. #1
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut Comment optimiser les temps de réponse d'une requête ?
    Bonjour,

    J'ai un bug assez bizarre : pour une même requête sur 2 bases quasiment identiques, dans 1 base la requête est exécutée en 2 secondes, et dans l'autre en 16 secondes...
    Il semble y avoir un problème sur les index :
    un "EXPLAIN SELECT..." me retourne :
    rows : 405 sur une table de 73'000 enregistrements
    et
    rows : 16 sur la même table (dans l'autre BDD) mais qui a 310'000 enregistrements...

    J'ai regardé la structure des 2 tables et les index utilisés :

    les index n'ont aucune cardinalité dans la base qui a le meilleur temps de réponse, tandis que dans l'autre base, tous les index de la table ont une cardinalité. Est-ce que ça a un rapport ?
    Comment corriger ça ? je suppose que c'est le nombre de lignes (405) qui pénalise les temps de réponse...

    Merci de vos éclaircissements;

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 494
    Points : 6 065
    Points
    6 065
    Par défaut
    Il peut y avoir plusieurs raison. Le type de moteur, les enregistrements ainsi que le nombre. 16 secondes je trouve que c'est enorme.

  3. #3
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Il faudrait voir la requête... C'est bien sur la plus petite table que la requête est la plus lente ?

    Sinon je crois que les valeurs données par EXPLAIN sont là à titre indicatif et correspondent aux estimations de mysql (il faut faire des SELECT partiels soi même pour voir combien de lignes on a réellement à chaque étape). Il est possible que les métriques étant différentes mysql opte pour des indexes différents, ou un autre ordre. EXPLAIN donne bien les mêmes indexes utilisés dans deux cas ?

    Sinon s'il y a une ou des jointures, avoir 400 résultats au lieu de 16 sur la première table peut faire très mal.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Peut-être que les statistiques des indexes ne sont pas à jour et erronés sur une des tables. Du coup MySQL ferait un un mauvais plan de requête.

    Un petit ANALYZE TABLE sur les deux tables pour les mettre sur un pied d'égalité quant à la justesse des données de l'index.

    edit : question, c'est quoi la cardinalité d'un index ?

Discussions similaires

  1. Hibernate comment optimiser le temps de réponse
    Par elkodadiyassine dans le forum Autres
    Réponses: 0
    Dernier message: 14/06/2011, 17h36
  2. Réponses: 5
    Dernier message: 18/07/2008, 12h40
  3. Réponses: 2
    Dernier message: 10/01/2007, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo