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

Langage PHP Discussion :

Optimisation de temps d'affichage d'une requete


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut Optimisation de temps d'affichage d'une requete
    Bonjour tout le monde,

    J'ai un gros souci de temps d'affichage pour ma requête.

    Imaginons :
    1 table de 50000 compétitions : competitions
    1 table de 5000 arbitres : arbitres
    et
    1 table qui permet d'indiquer tous les arbitres pour chaque compétition : gestion

    J'affiche le tout via ma requête classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $requete = "SELECT D.idCOMPET, D.nom_compet, D.tel_compet, D.email, D.date, D.supp, G.idARBITRE, U.idARBITRE  FROM `".$suff_table."competitions` D, `".$suff_table."gestion` G, `".$suff_table."arbitres` U  where D.idCOMPET=G.idCOMPET and G.idARBITRE=U.idARBITRE GROUP by D.idCOMPET order by D.idCOMPET desc";
    $resultat = mysql_query("$requete");
    Premiere question ya t'il une façon de réécrire plus proprement cette requête afin d'optimiser le temps s'il vous plait.

    Deuxieme question plus JS que PHP, j'utilise le plugins https://datatables.net/ qui classe tous les resultats sous forme de tableau, avec plusieurs pages (pagination tous les 100 resultats) mais surtout il me permet une recherche via un seul input sur toutes les informations présentes dans le tableau, ce qui est HYPER pratique pour mes recherches
    Le problème c'est qu'il accroit le temps d'affichage considérablement (2mn), car il doit une fois tout afficher, classer la premiere colonne par ordre alphabétique.

    Donc peut être qu'il faudrait que je zappe ce plugins, que j'affiche ma requête sous un tableau simple même si les 50000 lignes s'affiche sur la page (donc pas de pagination) et que je créé mon input avec recherche dans la page, et c'est la que ça se complique car faire des recherche avec LIKE, ok je sais faire mais l'interet du plugins est qu'il recherche n'importe quoi parmi les infos affichées, dans le cas ou c'est moi qui créé la recherche avec LIKe je risque d'en avoir des champs a tester ....


    Merci de tous vos conseils et aides.

    PS : A tous ceux qui pensent que je dois abandonner mysql pour PDO vous avez entièrement raison, mais j'attends cet été pour comprendre PDO, dans l'immédiat j'ai juste besoin de comprendre comme améliorer mon code en restant sur mysql, merci de votre indulgence.

    Guillaume

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

    1- "Premiere question" :
    Oui.
    En utilisant les jointures, avec INNER JOIN.

    2- "Deuxieme question" :
    Change le ORDER BY de la requête, en fonction de cette 1ere colonne !

    Au lieu de Datatables, on peut utiliser une pagination "classique" (avec LIMIT), avec ou sans Ajax.
    Pour n'afficher que 100 lignes a la fois.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Bonjour jreaux62 et merci pour ta réponse,

    Utiliser les jointures me permettra t-il de gagner du temps lors de l'affichage ?

    Merci de ton aide et de l'aide de tous ceux qui me liront.
    Guillaume

  4. #4
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Salut. Travaille sur ton PHPmyadmin cette partie, et met le nom de tes tables en dur
    1) as-tu posé des indexes, des clés d'unicité, des clés étrangères sur tes tables dans ta base ?

    Ta requête réécrite donnerait ce genre de trucs. Il faut la tester dans phpmyadmin encore une fois. Direct dans la fenêtre SQL.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT distinct c.idCOMPET, c.nom_compet, c.tel_compet, c.email, c.date, c.supp, g.idARBITRE, a.nomARBITRE  
    FROM `151competitions` c
    inner join `151gestion` g on c.idCOMPET=g.idCOMPET
    inner join `151arbitres` a on g.idARBITRE=a.idARBITRE
    group by c.idCOMPET

    Pose au moins des indexes sur les champs suivants
    c.idCOMPET, g.idCOMPET, g.idARBITRE, a.idARBITRE

    j'ai volontairement supprimé le order by pour que tu testes aussi le temps que le order by consomme.

    PS : ta requête initiale tourne combien de temps dans ton phpmyadmin ?

    Si c'est long après que tu as tout nettoyé, une solution est de transposer ta requête dans un fichier de format json avec json_encode, pour gagner du temps. Ca te fera un fichier plat.

  5. #5
    Membre averti Avatar de solo190
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 412
    Points : 321
    Points
    321
    Par défaut
    bonsoir a tous ,
    En attendant l'été pour passer à PDO tu peux deja passer à mysqli qui lui aussi est tres pratique .
    il faut vérifier les clé ( primaire et étrangère sur tes tables ) , avoir absolument des index .
    ne sélectionne aussi que les colonnes dont tu en a besoin .
    A+

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ton plugin datatables a 2 modes de fonctionnement : soit il charge tout depuis le serveur et fait la pagination et les filtres côté client (avec comme effet de bord d'avoir un 1er temps de chargement long), soit il envoie des requêtes AJAX au serveur pour toutes les opérations de pagination et filtre et se charge de faire l'affichage des données retournées.
    Datatables - Server-side processing

    Si tu as beaucoup de données à remonter, passer en mode serveur t'allègera le chargement, mais tu vas devoir écrire un script pour traiter les requêtes envoyées par le plugin.

    ET sinon, comme indiqué dans les autres réponses, optimise ta requête en l'écrivant proprement et en ajoutant les index adéquats.

Discussions similaires

  1. Réponses: 10
    Dernier message: 09/02/2010, 20h08
  2. Réponses: 1
    Dernier message: 17/10/2008, 15h25
  3. [Stratégie] Mesurer le temps d'exécution d'une requête
    Par nice dans le forum Général Java
    Réponses: 5
    Dernier message: 29/01/2006, 17h53
  4. Limiter les affichages d'une requete avec POstgre
    Par jenny50 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/01/2006, 16h26
  5. Réponses: 9
    Dernier message: 20/06/2005, 12h17

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