IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Table de données volumineuse


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 343
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 343
    Billets dans le blog
    17
    Par défaut
    Quand est-ce que ça plante exactement ?
    Quel est le msg d'erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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.

  3. #3
    Membre éclairé Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Par défaut
    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+

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    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.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    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 ?

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 343
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 343
    Billets dans le blog
    17
    Par défaut
    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

    et à quoi elles peuvent bien être utiles ?
    Faudrait répondre aux questions posées.

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. [Python 2.X] ajouter des données volumineuse dans une table oracle
    Par bernards111 dans le forum Général Python
    Réponses: 2
    Dernier message: 09/10/2014, 15h55
  2. Réponses: 2
    Dernier message: 11/01/2006, 11h54
  3. Tables avec données temporelles
    Par blins dans le forum Oracle
    Réponses: 12
    Dernier message: 12/12/2005, 09h50
  4. Réponses: 9
    Dernier message: 07/10/2004, 19h41
  5. [QuickReport] Données d'une table et données calculées
    Par poufouille dans le forum Bases de données
    Réponses: 11
    Dernier message: 30/03/2004, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo