Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Requete interminable [ Archives / Bases de données ] (arthurnet)

mardi 14 septembre 2004 à 00:01:29 | Requete interminable

arthurnet

Bonjour,
je développe un site sur serveur dédié (puissant).
Etant donné le nombre de requetes par secondes trop grand (78 req/sec), j'ai cherché à reduire celui-ci en optimisant mes scripts...

Plutot que de faire une boucle par requete, de la forme:

<?
$result = SELECT * FROM table1 WHERE ...
while($ligne = mysql_fetch_object($result)){
$result2 = SELECT * FROM table2 WHERE ...
while($ligne2 = mysql_fetch_object($result2)){
echo $ligne->row1." ".$ligne2->row2;
}
}
?>

j'ai transformer mes requetes avec des INNER JOIN, LEFT JOIN,...
pour avoir tout les resultats d'un seul coup.

Le probleme arrive lors de l'execution de ces requetes:

une page qui contient une seule requete reliant 3 tables différentes ne veut pas s'afficher en ligne alors qu'elle fonctionne tres bien en local (avec Easy PHP). Le chargement de cette page est tres long et au bout d'un certain temps, erreur "Impossible d'afficher la page".

Je suis donc aller voir les Processus Mysql pendant le chargement de cette page. Ma requete apparait bien dans la liste mais le tableau montre que:
Etat = "Copying to tmp table"
Durée = va jusqu'à 1500 sec

je voi meme d'autres requetes (qui sont a mon avis générées) apparaitre. De plus, lorsque je ferme la page qui charge le script, la requete reste toujours dans les processus et je dois la supprimer pour que le serveur arrete de ramer.

Vous allez surement me demander la requete en question, mais le probleme ne vient pas de là. Il est vrai que le site accueille beaucoup de visiteurs (donc beaucoup de requetes), mais tout les sites de programmation parlent d'INNER JOIN pour optimiser MYSQL, alors que dans mon cas, cela va dans le sens contraire.

Je vous demande de me faire part de toutes vos remarques ou de vos éventuels problemes sur ce point (même si vous ne connaissez pas l'explication), car c'est en discutant que vous m'aiderez à résoudre ce probleme qui m'insuporte.
En vous remerciant d'avance...

Arthur





mardi 14 septembre 2004 à 09:08:30 | Re : Requete interminable

phpwankenobi

Salut,

Cette durée me parait énorme....MySQL est tout de même très performant.

Il faudrait avoir une idée de la volumétrie (nombre de lignes) de tes tables, vérifier si les champs utilisés dans tes conditions "WHERE" sont bien indéxés, vérifier que ta requête est bien construite (qu'elle n'effectue pas un produit cartésien par exemple).

A+

mardi 14 septembre 2004 à 18:43:48 | Re : Requete interminable

arthurnet

Slt,

voila les 3 tables utilisées:


TABLE `soirees` (
`id` smallint(6) NOT NULL auto_increment,
`nom` varchar(255) NOT NULL default '',
`type` varchar(50) NOT NULL default '',
`description` text NOT NULL,
`code` varchar(50) NOT NULL default '',
`photo` varchar(255) NOT NULL default '',
`lieu` varchar(50) NOT NULL default '',
`email` varchar(255) NOT NULL default '',
`photographe` varchar(255) NOT NULL default '',
`dresscode` text NOT NULL,
`infoline` text NOT NULL,
`date` varchar(50) NOT NULL default '',
`poster` smallint(1) NOT NULL default '1',
`commentaire` text NOT NULL,
`photo_online` int(50) NOT NULL default '0',
`rang` int(10) NOT NULL default '0',
`visite` int(10) NOT NULL default '0',
`categorie` varchar(50) NOT NULL default '',
KEY `id` (`id`)
)

TABLE `comments` (
`nomsoiree` varchar(20) NOT NULL default '',
`urlphoto` varchar(20) NOT NULL default '',
`n_comment` int(11) NOT NULL default '0',
`commentaire` blob,
`nom` varchar(100) NOT NULL default '',
`email` varchar(100) NOT NULL default '',
`heure` varchar(15) NOT NULL default '',
`date` varchar(15) NOT NULL default '',
`idc` int(11) NOT NULL auto_increment,
`ip` varchar(20) NOT NULL default '',
KEY `idc` (`idc`)
)

TABLE `photos` (
`nomsoiree` varchar(20) NOT NULL default '',
`urlphoto` varchar(50) NOT NULL default '',
`vues` int(11) NOT NULL default '0',
`idp` int(11) NOT NULL auto_increment,
`width` int(11) NOT NULL default '640',
`height` int(11) NOT NULL default '480',
`poster` char(1) NOT NULL default '1',
KEY `idp` (`idp`)
)

TABLE soirees: 200 enregistrements
TABLE comments: 38326 enregistrements
TABLE soirees: 7921 enregistrements

voila ma requete:
SELECT *,soirees.date AS date_s, COUNT(comments.nomsoiree) AS nb_comm,photos_vues.nomsoiree AS lasoiree,photos_vues.urlphoto AS lurlphoto FROM photos_vues INNER JOIN soirees ON photos_vues.nomsoiree = code LEFT JOIN comments ON (photos_vues.urlphoto = comments.urlphoto AND photos_vues.nomsoiree = comments.nomsoiree)".$condition." GROUP BY photos_vues.idp ORDER BY vues DESC LIMIT 15

J'avais oublié de préciser que la requete qui ne fonctionne pas n'est pas la plus grosse du site...il y a une requete qui relie une table de 10000 enregistrements avec une table de 196000 enregistrments et celle-ci fonctionne parfaitement.

Merci de m'aider




mardi 14 septembre 2004 à 18:51:30 | Re : Requete interminable

arthurnet

je précise aussi que $condition est par default nulle, donc n'influe pas la requete.
la table photos_vues est en fait la table photos (erreur de copiage de ma part )

ps: si les tables sont aussi mal organisées, c'est juste paske je les récupère d'un ancien codeur.

++

mercredi 15 septembre 2004 à 12:31:59 | Re : Requete interminable

phpwankenobi

Réponse acceptée !
Salut,

Evidemment, vu la structure des tables t'es pas sorti de l'auberge!
Je te conseille de revoir la structure et d'être au minimum à la deuxième forme normale.

Cependant je pense qu'en ajoutant un index (non unique) sur les champs nomsoiree et urlphoto des tables comments et photos devrait améliorer la sauce.

a+

mercredi 15 septembre 2004 à 13:05:14 | Re : Requete interminable

phpwankenobi

Tu peux en outre faire une analyse de ta requête avant et après ajout des index pour effectuer une comparaison.

La commande à lancer est la suivante :



EXPLAIN SELECT *,soirees.date AS date_s, COUNT(comments.nomsoiree) AS nb_comm,photos_vues.nomsoiree AS lasoiree,photos_vues.urlphoto AS lurlphoto FROM photos_vues INNER JOIN soirees ON photos_vues.nomsoiree = code LEFT JOIN comments ON (photos_vues.urlphoto = comments.urlphoto AND photos_vues.nomsoiree = comments.nomsoiree) GROUP BY photos_vues.idp ORDER BY vues DESC LIMIT 15


Tu regardes la colonne "rows" du résultat qui te donne le nombre de lignes parcourues pour produire le resultat, il devrait être très différent avant et après ajout des index....

A+

vendredi 17 septembre 2004 à 00:29:18 | Re : Requete interminable

arthurnet

Bon je vais réorganiser mes structures avec des index, sinon
EXPLAIN -> rows
me retourne le nombre d'enregistrements de la table "photos_vues" donc je pense que même après ça sera la même chose

Merci de ces indications
++



Cette discussion est classé dans : page, probleme, requete, requetes, join


Répondre à ce message

Sujets en rapport avec ce message

probleme avec une requete ! [ par winroro98 ] bonjour !j'ai un probleme de requete avec mon code qd j'ouvre ma page il me met erreur requete mais la je ne vois pas !!!pouvez vous m'aidez !!!!merci probleme url requete mysql [ par petiteamoula ] salut j'ai un gros problème et j'espère que vous pouvez m'aidez j'ai la carte du monde réalisé en flah et j'ai l'intégrer dans dreamweaver comme swf probleme dans page d'inscription [ par vrkill2 ] bonjour j'ai un souci avec ce bout de scripte qui est sencé vérifier que le pseudo n'existe pas déjà, ça ne marche pas, si quelqu'un a une idée  Merci Probleme d'includes [ par konor ] Bonjour,Ca fait un petit moment que j'essai d'utliser la fonction include().J'utilise easyPHP comme serveur.Je pense bien avoir ecrit mon code mais je probleme avec le transfert des variables d'une page àa une autre [ par magirap ] salut tt le monde.je veux transmettre une variable d'une page à une autre,mais j'arrive pas, parceque j'utilise pas de formulaire, j connait pas la va probleme avec le transfert des variables d'une page àa une autre [ par magirap ] salut tt le monde.je veux transmettre une variable d'une page à une autre,mais j'arrive pas, parceque j'utilise pas de formulaire, j connait pas la va Probleme php [ par gege95 ] Bonjour !! J'effectue dans ma page une recherche toute simple sur un nom dans un table !! Cette requete à toujours fonctionnée jusqu'à ce que le nom s Probleme de configuration phpMyAdmin [ par themessenger ] Bonjour, Voila j'ai installé phpmyadmin pour mon site web chez chez.com . J'ai fait la configuration a l'aide des tutoriels en ligne mais j'arrive tou probleme de logique requete sql ! [ par clement1138 ] onjour , voila ma requete : $req="select id_blocage from blocage_horaire where id_emp=' ".$tab['id_emp']." ' AND (debut_blocage >=' ".$time_rdv_prevu Eviter le multiclic [ par kickers37000 ] Bonjour a tous :)Alors, je viens ici pour poser une petite question, c'est un peut le but non ? ^^J'ai un petit probleme avec un lien sur mon site, qu


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 2,184 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.