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 :

[MySQL 5]Performance d'une requêtes select


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut [MySQL 5]Performance d'une requêtes select
    J'ai la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    SELECT DISTINCT p.products_id, p.manufacturers_id, p.products_subimage5, 
    pd.products_price, pd.products_name, 
    p.products_style, m.manufacturers_name 
    FROM products p
    JOIN products_stock st ON (p.products_id=st.products_id)  
    JOIN products_description pd ON (p.products_id=pd.products_id) 
    JOIN products_tribu pt ON (p.products_id=pt.products)  
    JOIN manufacturers m ON (p.manufacturers_id=m.manufacturers_id) 
    WHERE p.products_status = '1' 
    AND st.products_stock_quantity > '0' 
    AND pd.language_id = '1' 
    AND p.marque='10' 
    AND pt.tribu='2'  
    ORDER BY p.products_ordered DESC LIMIT 48,12
    Cette requête va très souvent être appelée. Il faut qu'elle soit le plus performante possible.

    J'ai essayé de créer des vues pour la rendre plus rapide, mais ça n'a rien donné. J'ai également essayer d'utiliser des tables de type "MEMORY", mais les temps sont plus longs.

    J'ai également essayé de mettre des index, et parfois cela fonctionne, parfois non. J'ai quand même gagné pas mal de vitesse en mettant un index sur la table products_tribu sur le champ products_id et tribu_id.

    Je voudrais savoir s'il existe déjà une manière SQL d'optimiser cette requête. D'autre part, j'aimerais savoir si vous avez des conseils concernant les index pour cet exemple précis.
    J'ai déjà lu le dossier sur l'optimisation, mais j'aimerais savoir s'il y a des choses à faire sur cette requête précisemment.

    Sinon, existe-il des systèmes de cache ou de mémoire permettant de booster un peu les perfs de ma base de données?

    Merci!

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut
    En général, il faut déclarer des index sur les colonnes qui participent à la clause WHERE.

    Je suppose qu'il y en a un sur p.products_id (PK?)

    J'en mettrais bien un DESC sur p.products_ordered...

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 699
    Par défaut
    Citation Envoyé par qi130
    En général, il faut déclarer des index sur les colonnes qui participent à la clause WHERE.
    idem pour les colonnes qui sont utilisées pour les jointures

    SuperCed rajoute "explain" devant ta requête et montre nous le résultat

  4. #4
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    EXPLAIN SELECT DISTINCT p.products_id, p.manufacturers_id, p.products_subimage5, pd.products_price, pd.products_name, p.products_style, m.manufacturers_name
    FROM products p
    JOIN products_stock st ON ( p.products_id = st.products_id )
    JOIN products_description pd ON ( p.products_id = pd.products_id )
    JOIN products_tribu pt ON ( p.products_id = pt.products_id )
    JOIN manufacturers m ON ( p.manufacturers_id = m.manufacturers_id )
    WHERE p.products_status = '1'
    AND st.products_stock_quantity > '0'
    AND pd.language_id = '1'
    AND m.manufacturers_id =10
    AND pt.tribu = '1'
    ORDER BY p.products_ordered DESC
    LIMIT 0 , 12
    Résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    +----+-------------+-------+--------+----------------------------------------------+----------------+---------+------------------------------+------+---------------------------------+
    | id | select_type | table | type   | possible_keys                                | key            | key_len | ref                          | rows | Extra                           |
    +----+-------------+-------+--------+----------------------------------------------+----------------+---------+------------------------------+------+---------------------------------+
    | 1  | SIMPLE      | m     | const  | PRIMARY                                      | PRIMARY        | 4       | const                        | 1    | Using temporary; Using filesort |
    | 1  | SIMPLE      | st    | range  | idx_products_stock_attributes,stock_quantity | stock_quantity | 4       |                              | 9900 | Using where                     |
    | 1  | SIMPLE      | pt    | ref    | products_tribu                               | products_tribu | 8       | spartoo.st.products_id,const | 1    | Using index                     |
    | 1  | SIMPLE      | pd    | eq_ref | PRIMARY                                      | PRIMARY        | 8       | spartoo.st.products_id,const | 1    |                                 |
    | 1  | SIMPLE      | p     | eq_ref | PRIMARY                                      | PRIMARY        | 4       | spartoo.pt.products_id       | 1    | Using where                     |
    +----+-------------+-------+--------+----------------------------------------------+----------------+---------+------------------------------+------+---------------------------------+
    5 rows in set (0.01 sec)

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 43
    Par défaut
    Si ta version de MySQL est la 5, tu pourrais gagner un peu de ressource en utilisant une procédure stockée vue que l'analyse syntaxique sera effectuée lors de sa création de la procédure et non plus à chaque éxécution de la requête.

    Pour en savoir plus, regarde l'article de Maximilian au sujet des procédures stockées de MySQL5.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mathieu
    idem pour les colonnes qui sont utilisées pour les jointures
    SURTOUT pour les colonnes utilisées pour les jointures. Les autres colonnes de la clause WHERE ne doivent être indexées que si elles sont faiblement sélective.

  7. #7
    Membre éclairé
    Profil pro
    Ingénieur développement
    Inscrit en
    Juillet 2004
    Messages
    323
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement

    Informations forums :
    Inscription : Juillet 2004
    Messages : 323
    Par défaut
    Ca veut dire quoi "faiblement sélective"?

    Je vais regardé du coté des procédures stockées, mais la requête change souvent, en tous cas, dans la partie "where".

  8. #8
    Invité
    Invité(e)
    Par défaut
    La sélectivité, c'est le nombre de lignes retournées par une requêtes divisé par le nombre totale de ligne de données.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/05/2009, 18h21
  2. [SQL ] performances dans une requête
    Par claralavraie dans le forum Oracle
    Réponses: 12
    Dernier message: 05/01/2006, 17h54
  3. une requête SELECT INTO provoque un plantage sous Access
    Par Invité dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 29/12/2005, 11h35
  4. fusion de 2 colonnes dans une requête select?
    Par epeichette dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/11/2005, 23h05
  5. C'est possible dans une requête SELECT ?
    Par Kokito dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/04/2005, 16h59

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