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 :

Optimisations de requêtes SQL [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut Optimisations de requêtes SQL
    Bonjour,

    J'ouvre ce sujet pour vérifier les tables SQL et optimiser, si c'est possible, les requêtes SQL.

    Ci-dessous, les :
    test_site_utilisateur
    Code sql : 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
    19
    20
    21
    CREATE TABLE IF NOT EXISTS `test_site_utilisateur` (
      `id_utilisateur` int(11) NOT NULL AUTO_INCREMENT,
      `nom_etablissement_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `nom_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `prenom_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `date_naissance_utilisateur` date NOT NULL,
      `civilite_utilisateur` varchar(12) CHARACTER SET utf8 NOT NULL,
      `sexe_utilisateur` varchar(8) CHARACTER SET utf8 NOT NULL,
      `acces_utilisateur` int(11) NOT NULL DEFAULT '5',
      `email_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `pseudo_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `password_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `code_postal_etablissement_utilisateur` varchar(5) CHARACTER SET utf8 NOT NULL,
      `classe_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `matiereenseignee_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `ville_etablissement_utilisateur` varchar(255) CHARACTER SET utf8 NOT NULL,
      `date_inscription_utilisateur` datetime NOT NULL,
      `date_derniere_connexion_utilisateur` datetime NOT NULL,
      `date_creation_classe_utilisateur` datetime NOT NULL,
      PRIMARY KEY (`id_utilisateur`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

    test_site_relation_cours_tp_utilisateur (table relationnelle)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE IF NOT EXISTS `test_site_relation_cours_tp_utilisateur` (
      `id_rel_cours_user` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours_tp` int(11) NOT NULL,
      `id_utilisateur` int(11) NOT NULL,
      PRIMARY KEY (`id_rel_cours_user`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
    test_site_cours_tp :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE IF NOT EXISTS `test_site_cours_tp` (
      `id_cours_tp` int(11) NOT NULL AUTO_INCREMENT,
      `date_depot_cours_tp` datetime NOT NULL,
      `date_cloture_validation_cours_tp` datetime NOT NULL,
      `titre_cours_tp` varchar(255) CHARACTER SET utf8 NOT NULL,
      `contenu_cours_tp` longtext CHARACTER SET utf8 NOT NULL,
      `type_devoir_cours_tp` int(11) NOT NULL DEFAULT '1',
      `matiere_cours_tp` varchar(255) CHARACTER SET utf8 NOT NULL,
      `nom_auteur_cours_tp` varchar(255) CHARACTER SET utf8 NOT NULL,
      `classe_cours_tp` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_cours_tp`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

    Ci-dessous, les requêtes SQL :

    -De la page qui liste les cours :
    // Récupération de l'identifiant connecté dans la base de données
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id_utilisateur
    FROM test_site_utilisateur
    WHERE id_utilisateur=xxxx

    // Sélectionnement du bon Cours/TP (avec son identifiant) de l'élève dans la base de données
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT(t3.id_cours_tp), t3.titre_cours_tp, t3.matiere_cours_tp, t3.classe_cours_tp, t3.date_depot_cours_tp, 
    	t3.contenu_cours_tp, t3.nom_auteur_cours_tp, t3.type_devoir_cours_tp, t3.date_cloture_validation_cours_tp 
    FROM test_site_relation_cours_tp_utilisateur t2  
    LEFT JOIN test_site_cours_tp t3 
    	ON t2.id_cours_tp = t3.id_cours_tp 
    WHERE t2.id_utilisateur=".$_SESSION['id_utilisateur']."
    AND t3.type_devoir_cours_tp='1' 
    ORDER BY date_cloture_validation_cours_tp

    -De la page qui affiche un cours :
    // Sélectionnement de l'identifiant de l'élève connecté
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_utilisateur 
    FROM test_site_utilisateur
    WHERE id_utilisateur=".$_SESSION['id_utilisateur']."
    AND (acces_utilisateur='1' 
    OR acces_utilisateur='5')

    // Sélectionnement du bon Cours/TP
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT(date_depot_cours_tp),titre_cours_tp,contenu_cours_tp,matiere_cours_tp,nom_auteur_cours_tp,classe_cours_tp
    FROM test_site_cours_tp,test_site_utilisateur
    WHERE  id_utilisateur=".$_SESSION['id_utilisateur']."
    AND type_devoir_cours_tp='1'
    AND (acces_utilisateur='1'
    OR acces_utilisateur='5')
    AND id_cours_tp='$id_cours_tp';

    A mon avis la requête SQL suivante :

    Sélectionnement du bon Cours/TP (avec son identifiant) de l'élève dans la base de données
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT(t3.id_cours_tp), t3.titre_cours_tp, t3.matiere_cours_tp, t3.classe_cours_tp, t3.date_depot_cours_tp, t3.contenu_cours_tp, t3.nom_auteur_cours_tp, t3.type_devoir_cours_tp, t3.date_cloture_validation_cours_tp 
    FROM test_site_relation_cours_tp_utilisateur t2  
    LEFT JOIN test_site_cours_tp t3 
    	ON t2.id_cours_tp = t3.id_cours_tp 
    WHERE t2.id_utilisateur=".$_SESSION['id_utilisateur']."
    AND t3.type_devoir_cours_tp='1' 
    ORDER BY date_cloture_validation_cours_tp

    peut être optimisée.

    Qu'en pensez-vous ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pourquoi y'a t'il des DISTINCT ?

    Sinon je vois mal ce qu'on pourrait simplifier dans une requête aussi basique.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    on peut déjà simplifier "Sélectionnement" en "Sélection".

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Oui effectivement c'est difficile d'imaginer plus simple.
    Après tu peux toujours voir si tu peux optimiser tes index en utilisant EXPLAIN

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Après tu peux toujours voir si tu peux optimiser tes index en utilisant EXPLAIN

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Ok merci mais au vu des réponses il n'y a pas d'optimisation à faire à part ça. Il n'y avait que le à supprimer.

    Je mets donc ce sujet en "RESOLU".

    Merci de vos réponses.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Bonjour

    Pour que vous ayez une version d'ensemble, je vous remets les requêtes SQL mises à jour :

    Sur la page qui liste les cours :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT id_utilisateur
    FROM test_site_utilisateur
    WHERE id_utilisateur=".$_SESSION['id_utilisateur'])
     
    SELECT t3.id_cours_tp, t3.titre_cours_tp, t3.matiere_cours_tp, t3.classe_cours_tp, t3.date_depot_cours_tp, t3.contenu_cours_tp, t3.nom_auteur_cours_tp, t3.type_devoir_cours_tp, t3.date_cloture_validation_cours_tp 
    FROM test_site_relation_cours_tp_utilisateur t2  
    LEFT JOIN test_site_cours_tp t3 
    	ON t2.id_cours_tp = t3.id_cours_tp 
    WHERE t2.id_utilisateur=".$_SESSION['id_utilisateur']."
    AND t3.type_devoir_cours_tp='1' 
    ORDER BY date_cloture_validation_cours_tp"
    Sur la page qui affiche un cours :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT id_utilisateur 
    FROM test_site_utilisateur WHERE id_utilisateur=".$_SESSION['id_utilisateur']."
    AND (acces_utilisateur='1' 
    OR acces_utilisateur='5')"
     
    SELECT date_depot_cours_tp,titre_cours_tp,contenu_cours_tp,matiere_cours_tp,nom_auteur_cours_tp,classe_cours_tp
    FROM test_site_cours_tp,test_site_utilisateur
    WHERE  id_utilisateur=".$_SESSION['id_utilisateur']."
    AND type_devoir_cours_tp='1'
    AND (acces_utilisateur='1'
    OR acces_utilisateur='5')
    AND id_cours_tp='$id_cours_tp'"

    Citation Envoyé par sabotage Voir le message
    Pourquoi y'a t'il des DISTINCT ?
    Effectivement il n'y en a pas besoin, comme vous pouvez le voir je les ai supprimé.

    C'est tout ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [phpBB] Optimiser les requêtes SQL
    Par Jimalexp dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 22/09/2008, 07h33
  2. [phpBB] Optimiser les requêtes SQL
    Par Jimalexp dans le forum Langage SQL
    Réponses: 0
    Dernier message: 22/09/2008, 01h42
  3. optimisation de requête SQL
    Par millien dans le forum SQL
    Réponses: 4
    Dernier message: 03/03/2008, 12h48
  4. Optimisation de requêtes SQL - utilisation de IN SELECT
    Par cfeltz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/12/2006, 09h28
  5. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55

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