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

PHP & Base de données Discussion :

Index pour améliorer les performances


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut Index pour améliorer les performances
    Bonjour,

    J'ai un soucis d'optimisation sur cette requête que j'execute 1000 fois avec des id_product différents (et il est impossible de faire autrement ou la boucle des id_product)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.id_produits_etrangers,A.id_associations,A.seuil_programmer,PE.prix,PE.id_concurrents
    				FROM `associations` A ,`produits_etrangers` PE
    				WHERE A.id_product='.$p['id_product'].' AND PE.id_produits_etrangers=A.id_produits_etrangers 
     GROUP BY A.id_associations,PE.id_produits_etrangers
    PE.id_produits_etrangers et A.id_associations sont des clés primaires.
    J'ai essayé de créer pas mal d'index, composés ou non. Ce qui marche le mieux c'est un index sur association (id_product,id_produits_etrangers). Ca me fait une requête qui prend 30 secondes.
    Il faudrait arriver à quelques secondes.

    J'utilise MySQL et rien que pour ce soucis je suis prêt à changer de SGBD s'il y a mieux. J'ai vu qu'avec MySQL on ne peut pas faire d'index entre deux tables différentes. C'est bien dommage. Voyez vous un moyen d'optimiser cette requête avec MySQL ou avec un autre SGBD ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Peut être déjà en écrivant la jointure correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.id_produits_etrangers,A.id_associations,A.seuil_programmer,PE.prix,PE.id_concurrents
    				FROM `associations` A JOIN `produits_etrangers` PE ON PE.id_produits_etrangers=A.id_produits_etrangers 
    				WHERE A.id_product='.$p['id_product'].'
     GROUP BY A.id_associations,PE.id_produits_etrangers
    Egalement ton groupement n'est pas correct : tu n'as pas de fonction d'aggregation (count, sum etc.).

    Je n'ai pas compris si c'etait une requête qui prenait 30secondes ou les 1000 requêtes.
    En tout cas executer 1000 fois la même requête est evidemment un gouffre de performance, même si tu utilisait une requête préparé.
    Tu dis que c'est impossible de faire autrement, je ne vois pas pourquoi.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    J'ai fait la modification et j'ai enlevé le group by mais ça n'a rien changé du tout. Je pense que ces écritures sont tout simplement équivalentes

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi tu avais un GROUP BY ?

    Les écritures ne sont pas équivalentes, l'une est correcte l'autre non.

    Tu n'as pas répondu pour le temps d'éxecution ni sur ton impossibilité de faire une seule requête.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    J'en vois une de simple déjà d'optimisation, faire une seule requête qui remène tous les résultats d'un coup pour les 1000 produits :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.id_product,A.id_produits_etrangers,A.id_associations,A.seuil_programmer,PE.prix,PE.id_concurrents
    				FROM `associations` A JOIN `produits_etrangers` PE ON PE.id_produits_etrangers=A.id_produits_etrangers 
    				WHERE A.id_product IN (1,2,3,4....//bref la liste des 1000 id quoi)
     GROUP BY A.id_associations,PE.id_produits_etrangers,A.id_product
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    L'approche du sieur Spartacusply est plutôt bonne. Par contre, il faut bien faire attention car sur une table volumineuse avec un IN (1, 2 ... 1000+) il peut y avoir un problème de performance dans la mesure où la clause IN est séquentielle.
    Dans certains cas, il sera préférable de passer par une table temporaire indexée en mémoire (MEMORY) et de faire la jointure dessus.
    Difficile d'être catégorique, il faut faire des essais en fonction de l'environnement de production.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Points : 121
    Points
    121
    Par défaut
    Au final, j'ai essayé de mettre la boucles des 1000 objets dans ma requête SQL, déjà j'ai perdu des fonctionnalités et je n'ai gagné que 15% de perf... pas terrible
    J'ai fini par mettre en place un système de pré-calcul qui execute la requête et la met dans une table à part

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Au final, j'ai essayé de mettre la boucles des 1000 objets dans ma requête SQL
    C'est à dire que tu as essayé la technique que l'on t'as indiqué ?
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

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

Discussions similaires

  1. Astuces pour améliorer les performances
    Par amira dans le forum Langage
    Réponses: 10
    Dernier message: 29/03/2013, 10h24
  2. Réponses: 4
    Dernier message: 28/10/2011, 19h44
  3. Aide pour améliorer les performances Checkbox
    Par nbrau dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/11/2009, 11h35
  4. Paramètres pour améliorer les performances du serveur
    Par abdou_ci dans le forum Administration
    Réponses: 7
    Dernier message: 15/05/2008, 14h43
  5. Optimisation de jsp pour améliorer les performances
    Par djuddju dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 01/12/2006, 05h50

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