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

  1. #1
    Membre régulier
    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
    Points : 74
    Points
    74
    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
    Points : 44 155
    Points
    44 155
    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 éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    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
    Membre régulier
    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
    Points : 74
    Points
    74
    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 ?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    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

  7. #7
    Membre régulier
    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
    Points : 74
    Points
    74
    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.

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par vinceom92 Voir le message
    Ok merci mais au vu des réponses...
    Tu parles des réponses dans le forum ou des réponses de EXPLAIN ? La requête en elle-même est optimisée par contre au vu de la création de tes tables il doit certainement manquer des index pour optimiser la vitesse de traitement... Et c'est explain qui te donnera la réponse (en règle générale il faut des index sur les champs de recherche).

  9. #9
    Membre régulier
    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
    Points : 74
    Points
    74
    Par défaut
    Je parle des réponses du sujet.

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    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 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui c'est bien ce que je pensais.

    sabotage et jreaux62 ont répondus à ta question initiale à savoir que ta requête est optimisée (c.a.d. tout à fait classique, sans piège particulier).

    Je t'ai donné une réponse complémentaire, c'est à dire qu'en plus de la requête, la vitesse de traitement globale dépend aussi des index posés dans ta table. Et là tu pourrais certainement améliorer les choses car à mon avis il manque des index sur certains champs de recherche (d'après la création de tes tables). Basiquement on peut dire qu'il est souvent utile de poser des index sur tous les champs utilisés dans la clause WHERE. Et pour avoir plus de précisions (notamment dans les cas complexes) on utilise la commande EXPLAIN.

+ 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