begin process at 2012 05 31 14:55:36
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Base de données

 > 

MySQL

 > 

Requete SQL >120secondes


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Requete SQL >120secondes

lundi 8 février 2010 à 15:24:11 | Requete SQL >120secondes

morbak01

Bonjour,

Bonjour,
J'ai une table MySQL qui fait 510 000 lignes avec 19 champs qui représente des log de chaques jours sur une année ttes les minutes. Donc pr chaque jour j'ai env 1440 entrées
pour chaque jour de chacun des mois je cherche le MIN & MAX pour 4 Champs puis je fait un graph pour chaque mois de l'année. (graph avec la lib jpgraph).

Le pb c'est que la requete fait plus de 120 secondes, comment optimser le truc:
La table est organisée de cette façon:
Date hchc hchp
01/01/10 12345678 123456789

le code: ($annee est du style 2008)


Code PHP :
function sql_affiche_graph_annuel ($base_name,$annee)
{
$url_sql="localhost";
$table_sql="base";
$log="root";
$pass="";
	$MONTHS = array("Janvier", "Février", "Mars", "Avril", "Mai",
              "Juin", "Juillet", "Août", "Septembre", "Octobre",
								"Novembre", "Décembre");
	$dimx=300;
	$dimy=200;
	$ind_hc=array(12,32);				/
	$ind_hp=array(12,32);
	
	$A=substr($annee,2,2);

	$db = mysql_connect($url_sql, $log, $pass); // on se connecte à MySQL
	mysql_select_db($table_sql,$db); 	// on sélectionne la base 

	for ($num_mois=1;$num_mois<13;$num_mois++)	
	{
		if (strlen($num_mois)==1)//  Rajoute un Zero au chiffre des unités pr garder la meme lg de la string
			{$num_mois_new="0".$num_mois;}
		else
			{$num_mois_new=$num_mois;}
	
		for ($num_du_jour=1;$num_du_jour<32;$num_du_jour++)
		{
			if (strlen($num_du_jour)==1)//  Rajoute un Zero au chiffre des unités pr garder la meme lg de la string
				{$num_jour_new="0".$num_du_jour;}						
			else
				{$num_jour_new=$num_du_jour;}
				
			$jour_new=($num_jour_new.'/'.$num_mois_new.'/'.$A);
			echo '<b>jour new : '.$jour_new.'</b><BR>';
			// Extraction des valeurs MIN et MAX de HCHC et de HCHP
			$sql = "SELECT MIN(hchc) as min_hc2, MAX(hchc) as max_hc2,MIN(hchp) as min_hp2, MAX(hchp) as max_hp2 FROM $base_name WHERE date='$jour_new'"; 
			$result=mysql_query($sql) or die(mysql_error());
			$min_hc=mysql_result($result,0,'min_hc2');
			$max_hc=mysql_result($result,0,'max_hc2');
			$min_hp=mysql_result($result,0,'min_hp2');
			$max_hp=mysql_result($result,0,'max_hp2');
		
			$ind_hc[$num_mois_new][$num_du_jour]=$max_hc-$min_hc;
			$ind_hp[$num_mois_new][$num_du_jour]=$max_hp-$min_hp;
		}	
	}
	mysql_close($db); 



Il y a t il une façon nettement plus performante pour extraire ces infos?

Merci,
lundi 8 février 2010 à 15:48:20 | Re : Requete SQL >120secondes

syndrael

Alors il y a plusieurs façons:
1. changer le type de table. En effet, à titre d'exemple HEAP est plus rapide de MyISAM pour certaines requetes
2. calculer et mettre dans une table les Min et Max qui ne changeront plus jamais. ainsi, plus de recalcul
3. comme tes données sont ordonnées chronologiquement, peut-être qu'un traitement sur des fichiers formatés pourrait être un alternative (via grep ou awk).

Dans l'absolu, ne mettre en table que ce qui peut influencer la donnée à traiter et 'archiver' le reste.
S.
lundi 8 février 2010 à 16:51:00 | Re : Requete SQL >120secondes

nhervagault

Administrateur CodeS-SourceS
Salut,

Solution

Faire 1 requete qui ramene 360 lignes à la place de 360 qui ramene 1 ligne

Bon dev
lundi 8 février 2010 à 18:13:20 | Re : Requete SQL >120secondes

morbak01

hi,

je n'arrive pas trop a saisir, faire 1 requete qui ramene à 360 ligne reviens à extraire les jours... mais je ne vois pas trop quelle requete faire, peux-tu préciser stp.

thx,
lundi 8 février 2010 à 18:56:43 | Re : Requete SQL >120secondes

nhervagault

Administrateur CodeS-SourceS
Ca

Code :
SELECT MIN(hchc) as min_hc2, MAX(hchc) as max_hc2,MIN(hchp) as min_hp2, MAX(hchp) as max_hp2 ,`date` as date_1  FROM $base_name GROUP BY `date`


Et apres tu auras un code du genre

Code PHP :
$query = "SELECT ................";
$result = mysql_query($query) or die(mysql_error());


while($row = mysql_fetch_array($result)){
     $day = day($row['date_1']);
     $month = month($row['date_1'];
     $ind_hc[month($month['date_1'])][$day]=$row['max_hc2']-$row['min_hc2'];
     $ind_hp[month($month][$day]=$row['max_hp2']-$row['min_hp2'];
}

mysql_close($db);


C'est pas testé mais ca donne une idée de ce qui peut être fait
lundi 8 février 2010 à 20:05:00 | Re : Requete SQL >120secondes

morbak01

Wahou...

Sans vouloir abuser, j'ai pas tout compris à ton exemple.
Je viens de mettre les pieds ds le sql depuis qq jours seulement.
Peux tu me commenter un peu tout cela afin que j'essaye de comprendre la philosophie de l'approche stp.
(en autre day(...), month(...) ..)

sry
mais thx qd meme.
;)
lundi 8 février 2010 à 22:23:20 | Re : Requete SQL >120secondes

nhervagault

Administrateur CodeS-SourceS
Ok

Je ne connaissais pas ton niveau en PHP,
si la requete est ok tu auras normalement comme resultat


min_hc2, max_hc2, min_hp2, max_hp2 , date_1
1 2 6 10 01/01/2010
2 5 7 15 02/01/2010
.....


Code PHP :
while($row = mysql_fetch_array($result)){
    //on recupere le jour et le mois pour faire les indices du tableau
     $day = date('d',$row['date_1']);
     $month = date('m',$row['date_1'];
     $ind_hc[$month][$day]]=$row['max_hc2']-$row['min_hc2'];
     $ind_hp[$month][$day]=$row['max_hp2']-$row['min_hp2'];
}



Je ne connaissais pas les fonctions PHP par coeur.
et j'ai pas peu dérapé dans l'écriture de la boucle
je pense que ca doit être mieux.

Essaies de faire fonctionner la requete dans un premier temps et apres le code

Bon dev
mardi 9 février 2010 à 11:27:10 | Re : Requete SQL >120secondes

syndrael

Ah oui, si c'est ça ton niveau de PHP, laisse tomber mes solutions.. Un chouillat plus complexe à mettre en oeuvre.. LOL !!
mardi 9 février 2010 à 11:31:50 | Re : Requete SQL >120secondes

morbak01

Ben woui mais désoél, j'apprends

quoi qu'il en soit le code avance merci qd meme.

mardi 9 février 2010 à 12:44:49 | Re : Requete SQL >120secondes

syndrael

Après tu nous fera part de l'amélioration des performances. c'est toujours sympa de voir l'amélioration pour un m^me résultat.
S.

1 2

Cette discussion est classée dans : mysql, sql, max, min, result


Répondre à ce message

Sujets en rapport avec ce message

Retour à la ligne [ par philagui ] Bonjour,je fais afficher tous les resultats d'un champ d'une DB MySQL par l'intermédiaire du script suivant:$sql="SELECT Titre FROM Tableaux WHERE 1"; pb popup & mysql [ par pixou30 ] Salut à tous! voici mon problème : sur une page en php j'affiche le une partie du contenu de ma bdd (c'est une liste de films, avec référence, Année d Problème requête MySQL [ par albator77 ] Bonjour,Je débute en PHP, et j'ai un problème :Si je fais la requête suivante, il n'y a pas de problème :$result_sql = mysql_query("select Nom,Type,Ta probleme d'envoi email [ par pietbrouwers ] quelqu'un peut-il me dire ce qui ne fonctionne pas dans le script suivant : je n'arrive pas a recevoir par mail  le contenu de la facture. voir la fin Lecture dans une db MySql [ par rems02 ] Voilà j'ai un petit probleme:apres connexion à ma base de données MySqlje veux recuperer des données qui se trouventdans un tableau "compteur" colonne adaptation code..rrrrr [ par fersayn ] Bonsoir,J'ai deux formulaire avec des name produits et mots, et je souhaite faire une recherche dans deux champs d'une db sql qui portent les memes no prob pagination [ par soussan ] sltj'ai un rpob de pagination ; pour la premiere page tt marche bien mais pour la deuxième je suis bloqué ca donne pas la suite des enregistrement voi Afficher un resultat aléatoire d'un requete sql [ par loupile ] Bonjour, voilà je vous explique, j'aimerai qu'a chaque chargement de la page, les informations affichées soient différentes pour l'utilisateur ... j'a requete SQL genere Page Web inaccessible [ par morbak01 ] Bonjour, J'ai une table MySQL qui fait 510 000 lignes avec 19 champs qui représente des log de chaques jours sur une année ttes les minutes. pour chaq Checked sur input avec nom variable [ par eltyty ] Bonjour, je fais une lecture de deux table une client avec id, nom et champs dans laquelle les champs correspondent à des id (de la table logiciel) s


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales