Le while fait tomber le serveur SQL?

Berry12345
Invité n'ayant pas de compte PHPfrance

16 juin 2007, 00:02

Bonjour, je suis un peu neophytes en la matiere et j'ai un question quant aux capacites de traitements:
J'ai teste ce bout de code sur une base importante.
Le fait est que le serveur est tombe! :shock:

Je ne peut pas dire si j'y suis pour quelque chose, mais la personne qui gere le serveur m'assure que c'est le while qui a multiplier les requetes (a chaque test de boucle, une nouvelle requete). Ce qui aurait provoque le mise en drapeau du serveur.
....
     $select=' SELECT * FROM matable WHERE ID <2000';     
     $res=mysql_query($select) or die('Erreur SQL! '.$sql.mysql_error());
     echo '<p>';
     $i=0;
     while($val=mysql_fetch_array($res)){
       echo $val[$i];    //7 champs, entre 4 et 10 caracteres par champs
     }
... 
Ca me semble douteux. A mon sens, il n'ya qu'une seule requete avec un resultat bufferise en memoire (le probleme est peut etre la : surcharge de la memoire au niveau du serveur--> solution mysql_unbuffered_query() ?? ).

Je pense qu'il n'y a pas de lien entre le tombage du serveur et ce code. Remarquez, le Pb est peut etre ailleurs dans mon code, mais ca m'etonnerait. Et comme je suis nouveau, je peux pas dire que le mec qui m'a dit se plante, surtout que lui il a deja fait pas mal de php :lol:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 juin 2007, 00:42

C'est quoi comme hébergement ? Parce qu'il existe une façon simple de savoir ce qui crashe le serveur, activer le log de MySQL (variable "log") et regarder quelle est la dernière requête reçue quand ça arrive.

À part ça, en effet un très gros résultat peut provoquer ce genre d'erreur, combien d'enregistrements renvoit cette requête ? As-tu essayé avec mysql_unbuffered_query() ?

ViPHP
ViPHP | 5924 Messages

16 juin 2007, 00:43

Non, ca ne vient pas de ton while, enfin pas de celui ci. Après, ca pourrait venir du fait que les résultats sont mises en cache, mais j'ai des doutes. As tu un peu plus de code à montrer ? (as tu une requète inclue dans une boucle justement ? )

Berry12345
Invité n'ayant pas de compte PHPfrance

16 juin 2007, 01:07

J'ai fait effectivement l'erreur de mettre des requetes dans des boucles les voici mais il ne s'agit du code precedent. de plus mes codes de requetes ne sont jamais effectues en paralele (2 requetes en meme temps)
voici une de mes requetes bouclees (les autres sont quasiment copier coller):

function nbVues($debut, $fin, $interval){
		$this->ecrireAttribut();
		$nb_vues=0;
		for($i=0;$i<sizeof($this->services);$i++){ //ces services correspondent en fait a certaines des tables
				$select=' SELECT Count(ID) AS NB FROM '.Service::getNomTableView($this->services[$i]).' WHERE MsgText LIKE "%'.$this->ref.'%" AND Time1 >= '.$debut.' AND Time1 <= '.$fin;
	                        $res=Base::interroge($select,ATI);
				
				$nb_vues += $res[0]->NB;
		}
		return $nb_vues;
		
	}

j'ai teste ce code, je n'ai jamais eu de pb. Le plantage ne vient pas de la. Par contre je me suis rendu compte a juste titre en cherchant sur le net que c'etait absolument a proscrire.
comment s'en passer alors?

ViPHP
ViPHP | 5924 Messages

16 juin 2007, 02:03

Tu as combien de tables de ce type ?

Invité
Invité n'ayant pas de compte PHPfrance

16 juin 2007, 02:07

seulement 8

ViPHP
ViPHP | 5924 Messages

16 juin 2007, 02:15

Vu que ya que le nom de la table qui change à chaque fois (ce sont les mêmes conditions, la même structure de table), tu peux faire un truc du genre :

Code : Tout sélectionner

SELECT "table1" AS table, COUNT(ID) FROM table1 WHERE ... UNION SELECT "table2" AS table, COUNT(ID) FROM table2 WHERE ... UNION SELECT "table3" AS table, COUNT(ID) FROM table3 WHERE ... UNION ...
Et tu différencies donc chaque table par le nom que tu as indiqué dans la clause SELECT.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 juin 2007, 11:51

Pour info, MySQL ne peut pas utiliser d'index pour évaluer un LIKE qui commence par un joker. Par conséquent il est obligé de lire tous les enregistrements. Autrement dit, c'est super lent. Vérifie que tu as un index sur "Time1".

Regarde le manuel de MySQL au chapitre de l'optimisation et plus particulièrement de la commande EXPLAIN. Si ces requêtes posent problème, poste dans le forum SQL avec tous les renseignements demandés (un rappel est affiché lors de la rédaction) ainsi que le résultat de tes requêtes sous EXPLAIN.

ViPHP
ViPHP | 2144 Messages

16 juin 2007, 11:51

La question de base pourrait -être, pourquoi avoir huit tables de même structure et pas une seule.

Berry12345
Invité n'ayant pas de compte PHPfrance

18 juin 2007, 18:10

Merci pour toutes ces infos. je vais voir comment les mettre en oeuvre.

P.S:iclo, totalement d'accord avec toi!! Mais je suis pas responsable!