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

Requêtes MySQL Discussion :

Requete sur une table de 600 000 enregistrements


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut Requete sur une table de 600 000 enregistrements
    Bonjour à tous,

    Je travaille en php5 avec PhpMyadmin.

    Je suis en train de préparer une script mais je recherche des informations avant de commencer; Voila ma problématique.
    J'ai une table (Table1) de 40 000 enregistrement et une autre (Table2) de 600 000 enregistrements.
    J'ai déjà fait un formulaire avec une dizaine de critères de choix dont certains concernent la Table1 et d'autres la Table2.
    Après l'envoi du formulaire et la récupération des valeurs des critères (critere1, critere2, critere3 etc...) je lance une requête SQL du type

    SELECT * FROM Table2 LEFT JOIN Table1 WHERE var1= critere1 AND var2=critere2 AND etc...

    pour ensuite faire un echo de certains champs des 2 tables. Mais comme je me l'imaginais, la requête peut-être très longue (15,20mn ou plus)

    Y aurait-il une autre façon de construire ma requête SQL pour minimiser les temps de traitements ?

    Merci d'avance à celui ou celle qui pourra m'aider ou me mettre sur la voie.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    Pourrai-t-on avoir la description des tables et votre requete réelle ?

    A première vu je ne penses pas qu'il y ai d'alternative, faudrai juste voir si vous avez indexé correctement.

    (sinon votre jointure externe ne parchera pas car vous avez mit les conditions de sélectivité dans la clause where)

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut
    Voila ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	$reponse_ciblage_dcl = mysql_query("
      SELECT V.num_client, modele,nom_client, libelle_site, V.date_vente, V.prochain_controle_technique, V.date_intervention, V.date_debut_contrat_service, V.date_fin_contrat_service, C.ville, C.mail, C.code_postal, V.date_vente 
      FROM Table2 V 
      LEFT JOIN Table1 C ON CONCAT(V.site, V.num_client) = CONCAT(C.site, C.num_client) 
      WHERE  (".$requete_cibl_dcl.") 
    ") or die("erreur requete ciblage dcl ".mysql_error());
    $requete_cibl_dcl correspond aux conditions que j'ai récupéré du formulaire précédent

    cela donne par exemple date_vente=2010-01-01 AND code_postal=13000 AND mail<>'' etc...

    Pour ce qui est de la structure des tables je ne sais pas comment indiquer cela dans mon message.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Pourquoi passez vous par des concat pour faire votre jointure ?

    une jointure ce fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    on V.site = C.site and V.num_client = C.num_client
    Il faut aussi indexer ces 4 colonnes si ce ne sont pas des clefs primaires.
    Ensuite faudra développer la structure de vos table (cherchez dans la doc) si ca ne suffit pas

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut
    Merci pour l'info sur la jointure, je vais modifier comme vous le proposez.

    Ces 4 champs ne sont pas indexés (et ce ne sont pas non plus des clés primaires) je vais donc faire cette modification.

    Je viendrai indiquer dans cette discussion les résultats pour ceux qui seraient confrontés au même problème que moi.

    Merci encore et bonne fin de journée.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 110
    Points : 73
    Points
    73
    Par défaut
    Bonjour,

    Après avoir modifié ma requête et indexé les champs de la jointure dans mes 2 tables, j'ai obtenu des résultats impressionnants. Moins de 2 minutes pour joindre mes 2 tables (610 000 enregistrements et 45 000 enregistrements) et extraire les données sélectionnées.

    Bonne journée.

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Et en sortie vous avez combien de ligne ? (je trouve ça pas terrible comme perf)

    Les index créés, vous pouvez donnez le DDL ?

    Le plan d'exécution de la requête ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/09/2010, 16h17
  2. Requete sur une table de faits
    Par markoBasa dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/08/2008, 16h26
  3. [MySQL] Requete sur une table
    Par pierre50 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/09/2007, 18h30
  4. [Access] Requête sur une table et tri sur une autre
    Par VooDooS dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2006, 15h07
  5. Requete sur une table qui pointe 2 fois sur une autre
    Par Satch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/01/2006, 08h48

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