Accueil > Forum > > > > optimisation code de recherche
optimisation code de recherche
vendredi 25 août 2006 à 16:39:09 |
optimisation code de recherche

saojin
|
Bonjour, j'ai fais un p'tit module de recherche pour un site et j'aurais aimé avoir des conseils pour l'optimiser ou savoir si je devrai changer completement mon algo. si vous pouver m'aider ce serait super
$donnee= explode(" ",$_POST['champ']); $nbr_mot=count($donnee); for ($c=0; $c < $nbr_mot; $c++){ // echo $donnee[$c]." "; $produit = new scope("SELECT * FROM produit where mot_cle like '%".$donnee[$c]."%' and visible='1'"); while ($val=$produit->suivant()) { $existe=0; $indexMax=count($designation); for($I=0;$I<$indexMax;$I++){ // si oui on rajoute les produits a ceux qui existait deja if($designation[$I][0]==$produit->champ('id_produit')){ $designation[$I][1]+=1; $existe=1; } } if ($existe==0){ $designation[$indexMax][0]=$produit->champ('id_produit'); $designation[$indexMax][1]=1; } } // $produit = new scope("SELECT * FROM textile where mot_cle like '%".$donnee[$c]."%' and visible='1'"); while ($val=$produit->suivant()) { $existe=0; $indexMax=count($designation); for($I=0;$I<$indexMax;$I++){ // si oui on rajoute les produits a ceux qui existait deja if($designation[$I][2]==$produit->champ('id_textile')){ $designation[$I][1]+=1; $existe=1; } } if ($existe==0){ $designation[$indexMax][2]=$produit->champ('id_textile'); $designation[$indexMax][1]=1; } } } //----------------------------------------------------------------------------------------------------------------- // classement du tableau //----------------------------------------------------------------------------------------------------------------- if (count($designation)!=0){ //classement decroissant for($I=0;$I<count($designation)-1;$I++){ for($J=$I+1;$J<count($designation);$J++){ if ($designation[$I][1]<$designation[$J][1]){ $temp2=$designation[$I][2]; $temp1=$designation[$I][1]; $temp0=$designation[$I][0]; $designation[$I][2] = $designation[$J][2]; $designation[$I][1] = $designation[$J][1]; $designation[$I][0] = $designation[$J][0]; $designation[$J][2] = $temp2; $designation[$J][1] = $temp1; $designation[$J][0] = $temp0; } } } } $nbraffichage=count($designation); /* ajout des information dont on aura besoin pour l'affichage 0->id_produit 1->ordre d'importance 2->id_textile 3->designation 4->prix de depart 5->promotion 6->nouveautes 7->image 8->href 9->express 10->id */ $date_jour=gmdate("Y-m-d"); //echo $nbraffichage; for($I=0;$I<$nbraffichage;$I++){ //Produits: if ($designation[$I][0]!=""){ $id_produit=$designation[$I][0]; //requete produit $produit= new scope("select designation,fin_news,visible,express from produit where visible='1' and id_produit='".$id_produit."' limit 0,1"); $produit->suivant(); //remplissage info produit $designation[$I][10]=$id_produit; $designation[$I][3]=$produit->champ('designation'); if (date_jour<=$produit->champ('fin_news')) $designation[$I][6]="new"; if ($produit->champ('fin_news')=='1') $designation[$I][9]="express"; //requete tarif $tarif= new scope("select min(tarif) mintarif from tarif where id_produit='".$id_produit."' group by id_produit"); $val=$tarif->suivant(); $designation[$I][4]=$tarif->champ('mintarif'); //existence promotion ? $promotion= new scope("select id_promotion from promotion where date_debut <= '".$date_jour."' and date_fin >= '".$date_jour."' and id_produit='".$id_produit."' limit 0,1" ); if($promotion->suivant()){ $designation[$I][5]="promo"; $tarif= new scope("select min(tarif) mintarif ,id_promo from tarifpromo where id_promo='".$promotion->champ('id_promotion')."' group by id_promo"); $val=$tarif->suivant(); $designation[$I][4]=$tarif->champ('mintarif'); } //image et liens $image="images/produits/photo".$id_produit."1.jpeg"; if (!(file_exists($image))){ $image="administration/include/image/default.jpg"; } $designation[$I][7]=$image; $designation[$I][8]="details-produits.php?key=".$id_produit; } //Textile: elseif($designation[$I][2]!=""){ //info textile $id_textile=$designation[$I][2]; $textile= new scope("select designation,tarif from textile where visible='1' and id_textile='".$id_textile."' limit 0,1"); $textile->suivant(); $designation[$I][10]=$id_textile; $designation[$I][3]=$textile->champ('designation'); $designation[$I][4]=$textile->champ('tarif'); if (date_jour<=$textile->champ('fin_news')) $designation[$I][6]="new"; //existence promotion ? $promotion= new scope("select tarif_textile from promotion where date_debut <= '".$date_jour."' and date_fin >= '".$date_jour."' and id_textile='".$id_textile."' limit 0,1" ); if($promotion->suivant()){ $designation[$I][5]="promo"; $designation[$I][4]=$promotion->champ('tarif_textile'); } //image et liens $image="images/textile/photo".$id_textile."1.jpeg"; if (!(file_exists($image))) $image="administration/include/image/default.jpg"; $designation[$I][7]=$image; $designation[$I][8]="details-textile.php?key=".$id_textile; } }
Je fais des recherche sur deux table differentes produit et textiles (pour des besoins pour le reste du site ). Mon souci est que lorsque ma table contient ses 8 000 enregistrement , ça commencent a prendre beacoup de temps pour repondre. Merci d'avance
stephane La vie n'est qu'un long fleuve d'apprentisssage
|
|
vendredi 25 août 2006 à 17:50:04 |
Re : optimisation code de recherche

malalam
|
Hello,
ton code est un peu long pour le détailler... déjà, évite les SELECT * qui tue rapidement un serveur de bdd... BETWEEN est sûrement plus optimisé que date <= and date >= Ensuite apparemment la classe que tu appelles utilises des row_seek, ce qui est assez lent, mais pourquoi pas...les curseurs sont pratiques. Il y a bcp de conditions...sont elles vraiment nécessaires ? Pas de jointures possibles pour minimiser les données à aller chercher ?
Ca : elseif($designation[$I][2]!=""){ => elsif (!empty ($designation[$I][2]))
visible='1' => si visible est un champ avec une valeur de type entier, les apostrophes sont inutiles (voire en trop). Et sinon...si tu n'as que des valeurs de type entier...change le type de ton champ!
Après bon...je ne sais pas, je n'ai pas le courage de tout décortiquer.
|
|
vendredi 25 août 2006 à 18:18:41 |
Re : optimisation code de recherche

saojin
|
Merci , ça me permet deja d'avancer beaucoup et je t'en remercie. J'ai oublie de mettre le code de ma classe , c vrai que ça aurait aidé. J'utilise mysql_fetch_array dedans. visible est efectivement de type entier puisqu'il ne prend ke 0 ou 1 , j'ai dc coriger l'erreur. Je retire de suite tous mes * afin d'ameliorer mes requetes.Dommage qu'on puissent pas editer les messages , j'aurais fais les correction en live.
Les conditions sont obligatoires par rapport a mes requetes par contre je vais travailler le fait de pouvoir ajouter des jointures si ça peut accelerer le traitement. Par contre mon souci est en fin de traitement recuperer les données une a une car en utilisant select id_produit from table where id_produit in (5, 6.1) ça me retourne 1 5 6 et je perd alors mon classement. Y ' a t'il une autre solution?
|
|
samedi 26 août 2006 à 12:37:51 |
Re : optimisation code de recherche

malalam
|
Tu sais, en général, des requêtes prenant trop de temps sont dûes à une mauvaise structure de la base de données attaquée. Un petit tour sur les indispensables de la méthode Merise (bien moins complexe qu'il n'y parait) est une bonne idée pour se raffraîchir les idées sur la question. Pour ta dernière question, je ne vois effectivement pas vraiment d'autres solutions...qu'un curseur (je ne sais pas si c'est ce que tu as mis en oeuvre : je parle de row_seek et compagnie). mysql_fetch_array n'est une bonne idée que si on utilise avec ses options : MYSQL_ASSOC ou MYSQL_NUMERIC (je ne sais plus pour la dernière). Ou bien soit mysql_fetch_row ou mysql_fetch_assoc (). Car fetch_array renvoi un tableau double : indexé numériquement associativement. Ce qui est une perte de performance énorme, et de plus, totalement inutile.
|
|
samedi 26 août 2006 à 20:11:47 |
Re : optimisation code de recherche

FhX
|
MYSQL_BOTH :)
Bah vi Mala, soit l'un, soit l'autre, soit les 2 :D Par defaut, c'est MYSQL_BOTH au passage ;)
Si c'est pour utiliser les curseurs, autant le faire via les itérateurs en PHP5. Mais au vu de ce que je vois, c'est du PHP4... donc dommage :/
|
|
lundi 28 août 2006 à 14:20:27 |
Re : optimisation code de recherche

saojin
|
Ben en fait non j'avais pas mis en place un curseur, je vais travailler cette idée. Pour l'instant je recupereais les enregistrements que je mettais dans un tableau. et je classais le tableau selon le nombre de mot clés retrouvés dans les mot recherchés. Par contre je vois pas a quoi me servirais les curseurs, mais je vais regarder p'tet que je ne connais pas toutes leur propriétés.
En tout cas merci de vous etre penchés sur mon cas.
|
|
lundi 28 août 2006 à 14:25:48 |
Re : optimisation code de recherche

saojin
|
Concernant les requete un peu complexes , c'est du au fait que j'ai beaucoup de table du a un gros nombres de paramètre et de types de produit completement different, leurs seul point commun : les mot clef, designatin mais ou ça devient assez complex c'est quand je dois recuperer le plus petit de touts leur tarif ( tarif different selon quantite) , selon l'existence ou non d'une promotion a la date d'aujourd'hui, selon le type de produit ( promotion et remise differentes) et selon qu'un client soit connecté ( remise supplémentaire ). La recherche est d'ailleur la seule fonction qui me demande des requete aussi complexe, le reste est plus facilement optimisable.  saojin  La vie n'est qu'un long fleuve d'apprentisssage
|
|
Cette discussion est classée dans : id, produit, designation, tarif, textile
Répondre à ce message
Sujets en rapport avec ce message
Encore un mystère de l'Ouest [ par mikito ]
Bon mon pb est simple : voici ma requete: "SELECT * FROM `produit`, `produittempo` WHERE produit.id != produittempo.idd;"Explication du probleme :j'ai
Juliacom => calcul de stocks [ par malalam ]
bonjour Je me permets de prendre contact avec toi par ce biai carsJe n arrive plus à ecrire des messages avec le modulej'ai contacté les admins qui so
et oui encore recuperer variable aprés url? [ par juliacom ]
je m explique j'ai ecris ce bout de code qui ne fonctionne pas echo " ".$row["#null"]."Gestion du Stock\n";le but
probleme sur caddie en php [ par kowalska ]
voila mon probleme est que je ne trouve pas une solution a l'ajout de quantite d'un produit il me double le produit sinon le reste aucun probleme voic
soucis mise à jour et affichage [ par oceane751 ]
bonjour!voilà je voudrais pouvoir modifier la quantité de chaque article dans mon panier mais au lieu de ça, ça me modifie toutes les quantités des ar
Conception base de données [ par younes371 ]
Bonjour,j'ai fait une conception pour ma base de données, et je vous demande si c'est bon.Pour chaque Produit il ya un id et le nom, et aussi ce produ
Importer le contenue d’une base de donnée mysql dans un formulaire. [ par marc660 ]
Bonjour, En fait je voudrais importer le contenue d'une base de donnée mysql dans un formulaire. Par exemple 1) dans un menu déroulent ou les nom des
recherche d'enregistrement [ par duodiscus ]
bonsoir,alors voilà, j'ai une base de donnée qui contient des produitset j'ai une page de modification de produiten entête de cette page, j'ai une sor
catalogue [ par gaston_gb ]
salut à tous, je ve realiser un catalogue ou je recupere les images et les references des produit depuis la base de données, je suis parvenu à affiche
insert 2 clé [ par jaafar50 ]
Je voudrais savoir comment on fait pour inserer dans une table dont la clé primaire est la concaténation de deux autre clé venant d'autre table.table-
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|