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 :

optimisation d'une requete de recherche [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Par défaut optimisation d'une requete de recherche
    Bonjour à tous
    je fais une recherche selon un mot clé ($motCle) contenu dans un type de champs précisé par l'utilisateur a l'aide de radio button ($type)
    la requete est sur plusieurs tables et dynamiquement construite

    j'affiche dans un tableau les valeurs de retour, par groupe de 20 aidé par la pagination

    Mon problème est le suivant, quand je faisais mes teste il n'y avait pas vraiment de probleme car j'avais environ une centaine d'entré dans ma table, sauf que j'ai du migré un ancien systeme et tous les dossier qu'il avait...ca porte présentement mon nombre d'enregistrement a 15000...la recherche est fastidieuse, le temps pour afficher les résultats est significatif maintenant...


    La requete, testé en phpMyAdmin prend pratiquement 4 sec de temps d'execution moyen, je ne connais pas vraiment les temps requis ou habituel pour un nombre pareil d'enregistrement, mais bon est-ce normal ou encore c'est effectivement le temps que ca prend??

    je mets ici ma requete pour vous en donner une idée
    Les variables sont les suivante:
    $_SESSION['typeRecherche'] = tbldossier.dossierNum
    $_SESSION['motcle'] = ''; //Si c'es rien, ca cherche dans tous
    $page = la page où on est rendu lors de l'affichage
    $nb = le nombre d'affichage par page ..ici c'est 20

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    // Selection des enregistrements pour la page considérée
    $strScript = "SELECT SQL_CALC_FOUND_ROWS tbldossier.versionDossier, tblclientassure.clientAssurePrenom, tblclientassure.clientAssureNom,tbldossiercieassurance.numDossierAssurance, tbltiercepartie.prenomTier, tbltiercepartie.nomTier, tbldossier.dossierID, tblcieassurance.cieAssuranceNom, tbldossier.dossierNum, ";
    $strScript .= "(".$_SESSION['typeRecherche']." LIKE '".$_SESSION['motCle']."')*8+(".$_SESSION['typeRecherche']." LIKE '%".$_SESSION['motCle']."%') AS pertinence ";
    $strScript .= "FROM tbldossierajusteur ";
    $strScript .= "LEFT OUTER JOIN tbldossier ON tbldossierajusteur.dossierID = tbldossier.dossierID ";
    $strScript .= "LEFT OUTER JOIN tblclientassure ON tbldossier.clientAssurerID = tblclientassure.clientAssureID ";
    $strScript .= "LEFT OUTER JOIN tbldossiercieassurance ON tbldossier.dossierID = tbldossiercieassurance.dossierID ";
    $strScript .= "LEFT OUTER JOIN tblcieassurance ON tbldossiercieassurance.cieAssuranceID = tblcieassurance.cieAssuranceID ";
    $strScript .= "LEFT OUTER JOIN tbltiercepartie ON tbldossier.dossierID = tbltiercepartie.dossierID ";
    $strScript .= "WHERE tbldossier.dossierActif = 1 ";
     
    if($_SESSION['typeRecherche'] != "tblcieassurance.cieAssuranceNom"){ 
    	$strScript .= "AND tbldossiercieassurance.responsabilite = '100' ";
    }
     
    //$strScript .= "ORDER BY pertinence DESC, ".$_SESSION['typeRecherche']." ";
    $strScript .= "GROUP BY pertinence DESC, ".$_SESSION['typeRecherche']." HAVING pertinence > 0 ";
    //Modification de la requete d'affichage pour avoir que les enregistrements par tranche de $nb (20 ici)
    $strScript .= "LIMIT ".($page * $nb).",".$nb;
     
     
    echo $strScript;
    $requete = $objCon->dbQuery($strScript);
     
    // Nombre total d'enregistrements
    $script = "SELECT FOUND_ROWS()";
    $request = $objCon->dbQuery($script);
    $total = mysql_fetch_row($request);
    ...
    //affichage
    Donc, comment est ce qu'on fait pour rendre une recherh dans plusieur table d'une manière rapide et efficace??
    j'attends de vos conseils encore une fois

    P.S J'utilise mysql 4.1.20 et php 4.4.2
    En guise d'information voici le nombre d'enregistrement de chaque table actuellement:
    tbldossierajusteur -> 14 855
    tbldossier -> 14 953
    tblclientassure -> 11 873
    tbldossiercieassurance -> 14 861
    tblcieassurance -> 204
    tbltiercepartie -> 13

  2. #2
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Citation Envoyé par ozzmax
    Donc, comment est ce qu'on fait pour rendre une recherh dans plusieur table d'une manière rapide et efficace??
    Comment optimiser ses requetes :
    1) Effectuer un EXPLAIN de la requête qui posent problème
    2) Analyser les resultats
    3) Poser les index en fonctions des resultats
    4) Effectuer un ANALYZE sur toutes les tables qui font parties de la requête (le plus simple est de faire sur toute la base)
    5) Rejouez les resultats pour voir si ca a amelioré quelque chose, recommencer en 1)
    6) Effectuer régulièrement l'ANALYZE

    http://dev.mysql.com/explain

  3. #3
    Membre émérite
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Par défaut
    oki merci pour cela, je me penche sur le mot clé Explain qui semble etre intéressant

    tu peux me parler un peu des index et leur utilité?

  4. #4
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Je ne peux pas en dire plus que la doc de mysql :
    http://dev.mysql.com/doc/refman/5.0/...l-indexes.html

  5. #5
    Membre émérite
    Avatar de ozzmax
    Inscrit en
    Novembre 2005
    Messages
    977
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Novembre 2005
    Messages : 977
    Par défaut
    Salut j'ai lu les explications que tu m'as référé

    Je comprends l'utilisation mais je ne sais pas comment définir les index?

    comme c'est la, j'ai ajouter la commande suivante SELECT STRAIGHT_JOIN à ma requete plus haute...

    ca améliore grandement le retour de résultats...je lisais que Mysql n'.utilisait pas les index si j'utilise le LIKE avec un joker devant le mot clé..c'est mon cas dans ma recherche...est ce qu'a ce moment je ne peux les utiliser?

    Avec le simple ajout de STRAIGHT_JOIN je gagne significativement en temps d'execution...je passe de 4 sec a 0,15 sec...

    Est-ce un coup de chance ou la l'instruction améliore grandement la manière de procédé?

  6. #6
    Expert confirmé Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Par défaut
    Attention à ne pas bruler les étapes. Le straight_join court-circuite le travail de l'optimiseur. Pour moi c'est à utiliser en dernier recours, après avoir optimiser le reste et après avoir ajouter les index qui vont bien si besoin.
    As-tu fais ce que j'ai donné dans mon premier post ?

    Pour ajouter un index, il suffit de lire la doc ou d'utiliser phpMyAdmin

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/04/2006, 18h58
  2. Optimisation d'une requete récurrente
    Par winzou dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 23/01/2006, 22h07
  3. Optimisation d'une requete specifique
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/12/2005, 14h14
  4. Amélioration d'une requete de recherche
    Par sacrejohn dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/10/2005, 11h36
  5. optimisation d'une requete de recherche
    Par moog dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/04/2005, 16h58

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