Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/10/2011, 10h40   #1
Futur Membre du Club
 
Inscription : février 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 49
Points : 17
Points : 17
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 :
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??
Nathan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 10h49   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 11h39   #3
Futur Membre du Club
 
Inscription : février 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 49
Points : 17
Points : 17
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?
Nathan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 14h44   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 12h59   #5
Futur Membre du Club
 
Inscription : février 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 49
Points : 17
Points : 17
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.
Nathan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 13h10   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
On peut avoir le résultat de l'EXPLAIN de ta requête ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 16h28   #7
Futur Membre du Club
 
Inscription : février 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 49
Points : 17
Points : 17
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.
Nathan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 16h32   #8
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
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)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h01.


 
 
 
 
Partenaires

Hébergement Web