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 :

Requête SQL très lente


Sujet :

PHP & Base de données

  1. #1
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par défaut Requête SQL très lente
    Bonjour,

    la requête suivante:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql = "SELECT nom_pays, libelle_".$nomen.", sum(valeur) as valeur, sum(masse) as masse
    			from pays as p , ".$impexp."_".$annee." as e, ".$nomen." as c 
    			where e.code_pays=p.code_pays and p.nom_pays = '".$pays."'".
    			" and c.code_". $nomen ." = e.code_".$nomen." and libelle_".$nomen." = '".$produit."'";
     
    			$result = mysql_query($sql,$lien);

    Me prend plusieurs seconde, quelle peut en être la cause?
    Une des tables impliquées comporte environ 1,5 millions de lignes, les autres quelques centaines.

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

    Il faut mettre des INNER JOIN.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par défaut
    Bonjour jreaux62,

    merci pour ta réponse. Tu me proposes de réécrire ma requête sous forme algébrique: on m'a appris en cours qu'au niveau des algos de recherche, elle était équivalente à la formulation "historique" que j'ai utilisée (et que perso je trouve plus claire), serait-ce faux?

    Sinon, j'ai exécuté une requête de ce type directement au niveau du SGBD, et cela a pris 10 secondes. En réduisant la table d'un million de lignes à 10 lignes, cela a été immédiat. La taille de la table serait donc à mettre en cause. Ce qui, fort naïvement, me surprend un peu puisque j'avais cru que SQL servait justement à gagner du temps sur des choses de ce genre. Or un pote va infiniment plus vite en faisant la même chose juste avec python/csv.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Chezkele Voir le message
    ...on m'a appris en cours....

    1- Sachant que l'extension mysql_ est OBSOLETE depuis plus de 10 ans (!), il faut supposer que les conseils de "on" le sont aussi.
    Il faut utiliser PDO, et les requêtes préparées.

    2- Une autre optimisation est d'indexer les colonnes "utiles" des tables SQL.
    Mais, dans ce domaine, je ne suis pas spécialiste.


  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2016
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 278
    Par défaut
    Citation Envoyé par jreaux62
    Sachant que l'extension mysql_ est OBSOLETE depuis plus de 10 ans (!), il faut supposer que les conseils de "on" le sont aussi.
    Il n'y a que moi à blâmer pour l'usage de mysql_, c'était ce que j'avais dans les exemples que j'avais récupérés et le temps pressait. Merci pour ta remarque concernant PDO.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    merci pour ta réponse. Tu me proposes de réécrire ma requête sous forme algébrique: on m'a appris en cours qu'au niveau des algos de recherche, elle était équivalente à la formulation "historique" que j'ai utilisée (et que perso je trouve plus claire), serait-ce faux?
    cette formulation "historique" date de 1992 et est désignée sous le standard SQL-92.
    De nos jours pour faire la jointure entre les tables on utilise la jointure évoluée( INNER JOIN, LEFT JOIN, RIGHT JOIN ...) qui a l'avantage d'être plus rapide. Cette dernière est issue du standard SQL-99. Ce dernier standard date de 1999.

    Ce qui, fort naïvement, me surprend un peu puisque j'avais cru que SQL servait justement à gagner du temps sur des choses de ce genre. Or un pote va infiniment plus vite en faisant la même chose juste avec python/csv.
    tout dépend de la quantité des données. sur de petites volumétries un fichier sera plus rapide mais sur de grosses volumétries une base de données sera toujours plus rapide.Avec une BD tu peux formuler une requête pour récupérer une donnée précise ce qui n'est pas le cas pour un fichier où il faut tout lire.

    Comme mentionné précédemment les colonnes impliquées dans la jointure doivent être indexées(exceptées les colonnes définissant PRIMARY KEY et FOREIGN KEY qui sont automatiquement indexées). De même les colonnes impliquées dans les conditions(where, and, IN ...) doivent être aussi indexées.

    Une des tables impliquées comporte envirion 1,5 millions de lignes, les autres quelques centaines.
    le problème ce n'est pas d'avoir 1,5m d’enregistrements mais combien parmi ces derniers ont une correspondance dans les autres tables. C'est ce à quoi ta requête est censée répondre en d'autres termes combien de lignes ta requête affiche-elle ? si tu as beaucoup de lignes il faut penser à limiter l'affichage donc faire de la pagination. La clause SQL qui limite le nombre de lignes est LIMIT numero_ligne,nombre_de_lignes.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM table_a a INNER JOIN table_b b ON a.id = b.table_a_id
    LIMIT 0,50 ; # Affiche les lignes de 1 à 50

Discussions similaires

  1. Requête SQL très lente
    Par fishingman dans le forum VB.NET
    Réponses: 9
    Dernier message: 13/08/2012, 12h15
  2. Exécuter une requête SQL très longue
    Par coraziari_l dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/01/2008, 17h07
  3. Requête Access trés lente ?
    Par ghostdz dans le forum Bases de données
    Réponses: 4
    Dernier message: 03/08/2007, 08h41
  4. Réponses: 12
    Dernier message: 24/07/2007, 11h09
  5. requette sql trés lente
    Par mafilek dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/11/2006, 17h36

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