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 :

[MySQL] Optimisation de requête


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [MySQL] Optimisation de requête
    Bonjour à tous,

    Je suis en train de développer un site web, avec gestion d'utilisateurs, de news, de messagerie privée, ...

    Pour la gestion des données, j'ai prévu au premier appel d'une fonction permettant de retourner des infos d'un utilisateur, d'effectuer une seule grosse requête SELECT *, de trier les résultats dans un array, et à chaque demande d'infos future, cet array est parcouru.

    Les deux fonctions de ma classe gérant les utilisateurs:

    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
     
    public function getUser($id = 0, $field = '')
    {
    	$this->buildUsers();
    		if ($id == 0)
    		{ 
    			if ($_SESSION['USERID'] == 0 OR empty($_SESSION['USERID'])) { return; }
    			if (empty($field)) { return $this->userData[$_SESSION['USERID']]; }
    			else { return $this->userData[$_SESSION['USERID']][$field]; }
    		} 
    		else 
    		{
    			if (empty($field)) { return $this->userData[$id]; }
    			else { return $this->userData[$id][$field]; }
    		}
    }
    Utilisation: $op->getUser($id_utilisateur, $champ)

    ..et la deuxième qui construit les informations utilisateurs

    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
     
    private function buildUsers()
    {
    	if (empty($this->userData)) {
    		global $db;
    		$query = 'SELECT * FROM op_users';
    		$re = $db->query($query);
    		$max = count($re);
    		for($i=0;$i < $max;$i++)
    		{ 
    			foreach ($re[$i] as $key => $value)
    			{
    				$this->userData[$re[$i]->userid][$key] = $value;
    			}
    		}
    	}
    }


    Ma question est simple, est-ce assez convenable ainsi, ou dois-je effectuer une requête par demande (avec critères..etc)?

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Bonjour,

    Combien y a t il de ligne dans ta table op_users ?

    Ta table est elle destinée à atteindre un volume conséquent ?

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Si je comprend bien , pour chaque utilisateur tu charge la totalité de tous les autres ?
    D'une part je vois pas trop l'intérêt et de l'autre tu va vite déchanté quand tu auras 15000 utilisateurs.

    Charger tous les infos de l'utilisateur qui se connecte en sessions pour y avoir accès rapidement c'est bien , le reste ca va e bouffé du temps cpu et de la mémoire pour rien comparé à une simple requête.
    Faut pas oublier qu'un SGBD c'est fait pour être intérroger et que ca tiens sans soucis plusieurs dizaines/centaines de requête par seconde pour peux qu'elle soient optimisées (pas un select * from all par exemple ^^ )

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Juin 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Il y a également une messagerie privée, un système de news, de reports d'incidents, ..., et donc il est possible que j'aie à sélectionner les informations de plusieurs utilisateurs (en plus de l'actuel en session).

    En gros, soit je fais comme dans mon code plus haut, soit je fais une requête avec critère WHERE id=... pour chaque utilisateur.


    Et la table op_users ne contient pour le moment deux comptes, l'appli est encore en développement, et elle n'est pas destinée à contenir énormément d'entrées (mais je préfère miser gros).

    Merci de vos réponses.

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Citation Envoyé par Falistos Voir le message
    Il y a également une messagerie privée, un système de news, de reports d'incidents, ..., et donc il est possible que j'aie à sélectionner les informations de plusieurs utilisateurs (en plus de l'actuel en session).

    En gros, soit je fais comme dans mon code plus haut, soit je fais une requête avec critère WHERE id=... pour chaque utilisateur.


    Et la table op_users ne contient pour le moment deux comptes, l'appli est encore en développement, et elle n'est pas destinée à contenir énormément d'entrées (mais je préfère miser gros).

    Merci de vos réponses.
    Pour faire simple il est plus judicieux de faire 3 petites requête très ciblée qu'une très grosse généraliste.
    Avec select * user , tu force ton sgbd à parcourir toutes tes entrées , alors qu'avec une reqêtes cibler , si tu as des index judicieusement placés tu ne lira que les 3 ou 4 enregistrements nécessaires. Donc gain de temps et de performance

Discussions similaires

  1. [MySQL] Optimisation requête, affichage lent
    Par Yann39 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/10/2008, 11h23
  2. [MySQL] Optimisation de requêtes MySql
    Par oclone dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/07/2008, 11h20
  3. Réponses: 4
    Dernier message: 29/11/2007, 10h56
  4. Optimiser une requête mysql
    Par Raideman dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/09/2007, 21h18
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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