|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
Bonjour,
j'ai besoin de votre aide. J'ai besoin d'optimiser un process. Actuellement, j'ai le process suivant : Code PHP :
Qq'un a une idée d'optimisation? |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Bonjour,
pourquoi faire 3 requetes au lieu d'en faire une seule ? De plus une jointure se fait à l'aide de JOIN pas de WHERE |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
Parce que je veux filtrer et que lorsque j'essaie une seule requete, j'ai pas le resultat escompté.
Une idée de requete unique? |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
mets nous stp les schémas de tes tables
|
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
arrachage_contenu
Champ Type Null Défaut Commentaires MIME contenu_arrnum int(6) Non contenu_numarr varchar(10) Non contenu_arrcde varchar(6) Non contenu_arrcdecontenu varchar(10) Non contenu_arrclt varchar(6) Non contenu_arrart varchar(6) Non contenu_arrcond varchar(10) Non contenu_arrtaille varchar(50) Non contenu_arrordre varchar(10) Non contenu_arrdate date Non 0000-00-00 contenu_arrqtite decimal(10,0) Non 0 contenu_arrreel decimal(10,0) Non 0 contenu_arrachat decimal(10,0) Non 0 contenu_arrsite varchar(3) Non contenu_arruser varchar(3) Non contenu_arrstatut varchar(10) Non contenu_arrbl int(10) Non commandefourn_contenu Champ Type Null Défaut Commentaires MIME contenu_num int(10) Non contenu_cdefournnum varchar(10) Non contenu_cdenum varchar(10) Non contenu_cdenumcontenu varchar(10) Non contenu_date date Non 0000-00-00 contenu_cltnum varchar(10) Non contenu_datelivr date Non 0000-00-00 contenu_datearr date Non 0000-00-00 contenu_fourn varchar(10) Non contenu_statut varchar(20) Non contenu_article varchar(10) Non contenu_qtite decimal(10,0) Non 0 contenu_qlivr decimal(10,0) Non 0 contenu_pu decimal(10,2) Non 0.00 contenu_info longtext Non contenu_bl int(10) Non commande Champ Type Null Défaut Commentaires MIME cde_num int(6) Non cde_clt varchar(6) Non cde_type varchar(20) Non cde_datesaisie date Non 0000-00-00 cde_datecde date Non 0000-00-00 cde_ref varchar(100) Non cde_adressefactu varchar(5) Non cde_adresselivr varchar(5) Non cde_user varchar(3) Non cde_semaine varchar(2) Non cde_infolivraison longtext Non cde_suivis longtext Non cde_marquage char(1) Non cde_statutarrachage varchar(30) Non cde_statutlivr varchar(30) Non cde_statutfact varchar(30) Non cde_statut varchar(30) Non client Champ Type Null Défaut Commentaires MIME clt_num int(4) Non clt_nom varchar(50) Non clt_adresse1 varchar(50) Non clt_adresse2 varchar(50) Non clt_cp varchar(5) Non 0 clt_ville varchar(50) Non clt_pays varchar(10) Non clt_tel varchar(15) Non 0 clt_fax varchar(15) Non 0 clt_juridique char(2) Non clt_siret varchar(13) Non 0 clt_categorie varchar(10) Non clt_reglt char(2) Non clt_modereglt varchar(10) Non clt_domiciliation varchar(50) Non clt_bque varchar(5) Non clt_guichet varchar(5) Non clt_cpte varchar(11) Non clt_cle char(2) Non clt_auto decimal(10,2) Non 0.00 clt_encrs decimal(10,2) Non 0.00 clt_remise decimal(10,2) Non 0.00 clt_tva char(3) Non clt_bl char(1) Non clt_obs longtext Non clt_ex decimal(4,0) Non 0 actif char(3) Non |
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Code php :
Tu essaies ici de jointer un champs de type varchar(6) avec un champ de type int(4) ? Pas très cohérent ni rapide pour peu que les valeurs matchent... Règle d'or si applicable : jointer des colonnes numériques entre elles, cela est bien plus rapide Ceci étant dit, rien ne t'empeche de récupérer un jeu de résultat sur tes tables imbriquées dans ton while puis de filtrer/mettre en forme par php ce sera plus rapide que de faire X requêtes nécessitant une surcharge serveur et des allers retours |
||
|
|
00
|
|
|
#7 | |||
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#8 | ||
![]() ![]() |
Si je comprends bien ton code, cette requête devrait te donner directement le résultat :
Code :
Et profites-en pour apprendre la syntaxe normalisée depuis 1992 pour les jointures !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
Merci pour ta requete, mais le process dure encore + longtemps..
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
La requête que t'a donné CinePhil te permet de ramener les résultats une bonne fois pour toutes sans devoir après effectuer de multiples autres requêtes dynamiquement. C'est donc une requête un peu plus lente, mais en contrepartie, tu ne fais plus d'autres requêtes. Donc une question : as tu supprimé les requêtes dans ton while avant de dire que le process dure plus longtemps ?
|
|
|
00
|
|
|
#11 |
![]() ![]() |
Autre question classique quand on est confronté à une requête lente : tes tables sont-elles correctement indexées ? Notamment les colonnes figurant dans les jointures (clés étrangères en principe).
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
J'ai directement testé la requete sur mysql sans l'intégrer dans le script
|
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 2 278 ![]() |
Quand tu dis lente, c'est combien de temps précisément et sur combien de lignes ? Il faut savoir aussi qu'en modifiant le type du champs de varchar à int pour une reprise d'un projet un jour, j'ai gagne 90% de temps d'exécution de la requête...donc tu sais ce qu'il te reste à faire
|
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
J'ai crée les bons index, modifié mes tables en transformant les varchar en int
Sur 19000 enregistrement, qui doivent extraire 90 enregistrements cela prends 60s... |
|
|
00
|
|
|
#15 |
![]() ![]() |
19 000 lignes ce n'est rien du tout pour un SGBD ! Sur un serveur digne de ce nom, cette requête devrait durer moins d'une seconde.
Mais je me rends compte que je me suis trompé dans la deuxième jointure ! Remplace par : Code :
INNER JOIN arrachage_contenu AS t3 ON t3.contenu_arrcde = t1.cde_num On peut avoir le résultat de EXPLAIN suivi de la requête ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#16 | |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
Résultat de la requête SQL
Serveur: localhost Base de données: soupe Généré le : Jeudi 25 Novembre 2010 à 15:05 Généré par: phpMyAdmin 2.6.1 / MySQL 4.1.9-max requête SQL: Code :
EXPLAIN SELECT t1.cde_num, t1.cde_datecde, t1.cde_ref, t2.clt_nom, t2.clt_num, COUNT(t3.contenu_arrnum) AS nb_arrachage_contenu, COUNT(t4.contenu_cdenum) AS nb_commandefourn FROM commande AS t1 INNER JOIN client AS t2 ON t1.cde_clt = t2.clt_num LEFT OUTER JOIN arrachage_contenu AS t3 ON t3.contenu_arrcde = t1.cde_num LEFT OUTER JOIN commandefourn_contenu AS t4 ON t4.contenu_cdenum = t1.cde_num WHERE t1.cde_statutarrachage <> 'cloture' GROUP BY t1.cde_num, t1.cde_datecde, t1.cde_ref, t2.clt_nom, t2.clt_num ORDER BY t1.cde_num; Citation:
|
|
|
|
00
|
|
|
#17 |
![]() ![]() |
On voit qu'il n'utilise quasiment aucune clé (aucun index), notamment sur les tables t3 et t4.
Donne nous les scripts exacts de création des tables :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#18 | ||||||
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
requête SQL: SHOW CREATE TABLE arrachage_contenu;
Enregistrements: 1 Table Create Table arrachage_contenu Code :
Enregistrements: 1 Table Create Table commandefourn_contenu Code :
Enregistrements: 1 Table Create Table commande Code :
|
||||||
|
|
00
|
|
|
#19 | ||
![]() ![]() |
Je vois que contenu_arrcde est toujours en VARCHAR(6) alors qu'elle fait référence à cde_num qui est, fort justement, un entier.
Si tu avais mis en oeuvre, comme il se devrait dans un SGBDR, les clés étrangères en utilisant le moteur InnoDB, tu te serais aperçu de cette erreur. Idem pour la colonne contenu_cdenum qui est toujours en VARCHAR(10). Et je ne vois aucune clé d'index dans tes tables ! Voici un exemple d'une de mes tables très simple : Code :
La non-concordance des types entre les clés étrangères et les clés primaires, ajouté au non indexage des tables, hormis bien sûr la clé primaire qui est automatiquement indexée par le SGBD, sont sans doute la cause de la lenteur de la requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#20 |
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 14 ![]() |
Excuse moi, mais je ne t'ai pas envoyé les bons infos.
J'ai 2 postes : un sous window dans lequel j'ai le serveur de développement, et un sous linux d'où je bosse en même temps, et je fais des tests sur les 2 machines en même temps. Sur le poste window, j'ai bien fait les modifs. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com