Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2011, 18h26   #1
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Par défaut Table de données volumineuse

Bonjour,
J'ai un script qui communique avec une table. En local, la table avec 1000 entrées tout roule bien. En production en ligne, la table renferme environ 200 000 entrées, du coup le script plante.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
//Array des census
function getCensus() {
	global $db;
	$sql = 'SELECT a.idagent as agent_id, a.nom as nom, a.prenom as prenom, a.sexe as sexe, a.matricule as matricule, a.telephone as tel, a.email as email, c.libellecorps as corps, c1.libellecadre as cadre, p.libelleposte as poste, r1.libellerang as rang, r.date_affectation as date_affectation, r.validation as validation, r.administration as administration, r.service as service, r.structure as structure, r.region as region, r.dpt as dpt, r.arr as arr FROM recensement r 
				INNER JOIN agents a ON a.idagent = r.agent
				INNER JOIN corps c ON c.idcorps = r.corps
				INNER JOIN cadres c1 ON c1.idcadre = r.cadre
				INNER JOIN postes p ON p.idposte = r.poste
				INNER JOIN rangs r1 ON r1.idrang = r.rang';
	$statement = $db->prepare($sql);
	$statement->execute();
	$tabl_results = $statement->fetchAll();	
	return $tabl_results;
}
 
//Appel de la fonction
$arrayCensus = getCensus();
Avec $arrayCensus je fais des traitements divers par exemple regrouper des census de sexe masculin et féminin
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
$arrayCensusMan = array();
$arrayCensusWoman = array();
foreach ($arrayCensus as $census) {
	if ( $census['sexe'] == 1 ) {
		array_push($arrayCensusMan, $census);
	}
	else {
		array_push($arrayCensusWoman, $census);
	}
}
//Affichage
echo count($arrayCensusMan);//les hommes
echo count($arrayCensusWoman);//les femmes
Ce n'est que un exemple de traitement j'en fais plusieurs autres pour faire des
états à base de cet array initial. Chaque traitement me retourne un array et je fais un count() pour retourner le nombre d'items. Du coup la page page plante.

Quelqu'un pourrait me venir en aide résoudre ce dilemme ?

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 01h40   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Quand est-ce que ça plante exactement ?
Quel est le msg d'erreur ?

Code :
$tabl_results = $statement->fetchAll();
Si ta requête retourne 200 000 lignes pesant chacune 300 octets alors le tableau $tabl_results pèsera à lui seul 200 000 * 300 = ~60 mégaoctets. Il va probablement falloir être moins gourmand.

Essaie de restreindre les résultats au maximum, de n'extraire que le strict nécessaire au traitement.
Essaie de faire faire les traitements par MySQL (procédures stockées).
Au pire traite tes données MySQL dans un while qui parcourera le jeu de résultat sans le stocker entièrement en mémoire.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2011, 09h09   #3
Membre éclairé
 
Avatar de Sekigawa
 
Développeur Web
Inscription : mars 2008
Messages : 426
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2008
Messages : 426
Points : 316
Points : 316
Quel est exactement le but de votre requête ?

Un affichage de toutes les lignes ? Si c'est la cas pourquoi ne pas faire un système de pagination ?

Juste affichage le nombre de ligne ? Si c'est le cas pourquoi ne pas faire une requête avec un count ?

A+
__________________
Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.
Sekigawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 08h44   #4
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par Séb. Voir le message
Essaie de faire les traitements par MySQL (procédures stockées).
Bonne idée.
C'est quoi les procédures stockées et à quoi elles peuvent bien être utiles ?
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 08h46   #5
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par Sekigawa Voir le message
Quel est exactement le but de votre requête ?

Un affichage de toutes les lignes ? Si c'est la cas pourquoi ne pas faire un système de pagination ?

Juste affichage le nombre de ligne ? Si c'est le cas pourquoi ne pas faire une requête avec un count ?

A+
Des bonnes pistes. Merci.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 09h51   #6
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Citation:
Envoyé par okoweb Voir le message
C'est quoi les procédures stockées
Ce sont, en quelque sorte, des fonctions traitant directement les données de la base de données.
Un de leurs avantages : pour les gros volumes de données elles évitent le transit client PHP / serveur MySQL.
http://dev.mysql.com/doc/refman/5.0/...rocedures.html

Citation:
et à quoi elles peuvent bien être utiles ?
Faudrait répondre aux questions posées.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 18h35   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Citation:
Chaque traitement me retourne un array et je fais un count() pour retourner le nombre d'items.
Ceci sera beaucoup plus rapide et prendra moins de ressources :
Code :
1
2
3
SELECT sexe, COUNT(*) AS Nombre
FROM recensement
GROUP BY sexe
Le SGBD sera toujours plus rapide que le PHP pour faire du traitement massif de données, c'est son boulot !
__________________
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 !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h58.


 
 
 
 
Partenaires

Hébergement Web