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 :

Pb de temps d'execution pour trouver le dernier enregistrement


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut Pb de temps d'execution pour trouver le dernier enregistrement
    Salut,
    Voila mon pb:
    J'ai un table "T1" qui à environ 1,5 million de lignes et les colonnes suivantes :
    IDENT(texte)
    DONNEES(texte)
    EVENT(num)
    DATE(date)
    Il n'y a pas de clé primaire. Il y a plusieurs enregistrement avec le même IDENT.
    J'ai créé les index suivants :
    IDENT
    DATE
    EVENT
    IDENT + EVENT + DATE
    IDENT + EVENT
    Je cherche les données (DONNEES) du dernier enregistrement (selon DATE) pour un identifiant donné (IDENT) et un lot d’événements (EVENT).
    J'ai donc pondu cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DONNEES 
    FROM T1 
    WHERE IDENT="toto" 
    AND EVENT IN (8,45,46,47,205,206)
    ODRER BY DATE DESC
    LIMIT 1
    Jusque là tout vas bien!
    Mais en fonction de l'identifiant que je rentre j'ai des temps de réponse carrément anarchiques.
    Par exemple pour l'identifiant "toto" qui à 38000 lignes la requête s’exécute en 0,3 secondes tandis que pour l’identifiant "titi" qui à 3500 lignes elle met 20 secondes !!!?
    Comment ça se fait d'après vous??

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si tes IDENT font moins de 256 caractères, passe la colonne en VARCHAR.

    Comment as-tu créé l'index sur la colonne IDENT ?
    Citation Envoyé par Doc MySQL
    Pour les colonnes BLOB et TEXT la longueur d'index est obligatoire. La requête suivante crée un index en utilisant les 10 premiers caractères de la colonne name :
    mysql> CREATE INDEX part_of_name ON customer (name(10));
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    En fait mon IDENT est déjà un varchar(100).
    Par contre je n'ai pas précisé la longueur lorsque j'ai créé l'index (avec phpmyadmin) mais dans les faits tous mes IDENT font 10 caractères pour le moment.
    Pense tu qu'il faut que je re-crée l'index en précisant la longueur?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Nathan Voir le message
    En fait mon IDENT est déjà un varchar(100).
    Pense tu qu'il faut que je re-crée l'index en précisant la longueur?
    Non, par contre tu peux réduire la taille du VARCHAR si tu es sûr que tous tes IDENT font maxi 10 caractères et n'en feront jamais plus.

    Peut-être aussi que l'absence de clé primaire est préjudiciable.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Alors,
    J'ai supprimé puis recréé l'index sur le IDENT en précisant la longueur (100 car ils ne font que 10 pour le moment mais ça vas changer).
    J'ai aussi ajouté une colonne ID en auto-incrément et clé primaire.
    Mais tout cela n'a rien changé.....
    J'ai lancé une défragmentation de la table avec Phpmyadmin pour voir ...
    Je vous tend au courant.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On peut avoir le résultat de l'EXPLAIN de ta requête ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 49
    Points : 36
    Points
    36
    Par défaut
    Après un silence de quelques jours, je reviens à la charge pour vous donner ma solution.
    J'ai fait des tests dans tous les sens, avec des clé primaires, des FORCE INDEX, avec un ORDER BY ASC et DESC, sans le LIMIT, des OR à la place du IN, etc...
    Résultat, toujours pareil les temps de réponse sont complètements aléatoires!
    Mais je me suis aperçus que mes table étaient en INNODB (je ne savais même pas ce que ça voulait dire).
    Je me suis un peut renseigner sur internet pour comprendre les différences entre INNODB et MYISAM pour finalement m’apercevoir que comme je n'utilise pas de transaction, je n'ai pas besoin que mes table soit en INNODB.
    Et qu'en plus les SELECT "complex" sont plus rapide en MYISAM.
    J'ai donc passé mes tables en MYISAM et ... Oh miracle, les temps de réponse sont de quelques millisecondes!
    Voila, en espérant que ça servira à quelqu'un d'autre ...
    Merci.

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Il y a bien d'autres différences entre MyISAM et InnoDB, notamment les recherches FULL-TEXT non supportées en InnoDB qui, par contre, implémente les FOREIGN KEYS.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. [AC-2007] Requête pour trouver le dernier indice visé par un client
    Par curt dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 04/10/2009, 09h30
  2. Requête pour trouver les derniers avec condition
    Par Philippe608 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/01/2008, 21h17
  3. trouver le dernier enregistrement
    Par matio dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/10/2006, 13h34
  4. MySQL : trouver le dernier enregistrement
    Par matio dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/10/2006, 12h47
  5. Trouver le dernier enregistrement d'une table
    Par remi59 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/03/2003, 14h54

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