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 :

SELECT lent en InnoDB


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut SELECT lent en InnoDB
    Bonjour,

    J'ai un probleme avec un SELECT trop lent en InnoDB (en embedded).

    Ma base contient trois tables que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
        CREATE TABLE GENERATED_MESSAGE ( 
    	id_id_gme INT NOT NULL, 
    	tme_since_gme DATETIME NOT NULL,
    	tor_since_gme CHAR ( 3 ) NOT NULL,
    	tme_until_gme DATETIME,
    	int_occur_gme MEDIUMINT NOT NULL,
    	stm_status_gme VARCHAR ( 30 ) NOT NULL,
    	knd_ima_gme VARCHAR ( 3 ),
    	int_event_gme MEDIUMINT NOT NULL,
    	cla_class_gme TINYINT NOT NULL,
    	int_msn_acf MEDIUMINT NOT NULL,
    	id_id_phi INT NOT NULL,
    	int_id_syb MEDIUMINT NOT NULL,
    	sid_side_bas MEDIUMINT NOT NULL,
    	fmc_code_fau INT NOT NULL,
    	int_version_top MEDIUMINT NOT NULL,
            boo_gndscan_gme TINYINT(1),
    	PRIMARY KEY (id_id_gme),
            INDEX gme_index (int_id_syb, sid_side_bas, fmc_code_fau,   int_version_top)) TYPE = InnoDB
     
     
    CREATE TABLE FDCE_CODE (
    	id_id_fdv INT NOT NULL AUTO_INCREMENT,
    	fde_code_fdv MEDIUMINT  NOT NULL,
    	fdt_type_fdv MEDIUMINT  NOT NULL,
    	id_id_gme INT NOT NULL,
    	boo_isfromcd_fdv TINYINT(1),
    	PRIMARY KEY (id_id_fdv, fde_code_fdv),
    	INDEX fdecode_index (id_id_gme),
    	FOREIGN KEY (id_id_gme) REFERENCES GENERATED_MESSAGE (id_id_gme)) TYPE = InnoDB
     
    CREATE TABLE COMPLEMENTARY_DATA (
    	id_id_cod INT NOT NULL AUTO_INCREMENT,
    	int_set_cod TINYINT NOT NULL,
    	bin_codata_cod BLOB,
    	tme_newconfirmation_cod DATETIME NOT NULL,
    	id_id_gme INT NOT NULL,
    	fmcgroup_code_cod MEDIUMINT,
    	PRIMARY KEY (id_id_cod),
    	INDEX cd_index (id_id_gme),
    	FOREIGN KEY (id_id_gme) REFERENCES GENERATED_MESSAGE (id_id_gme)) TYPE = InnoDB
    Mon programme remplit ces tables avec 88 000 enregistrements dans GENERATED_MESSAGE, 88 000 dans FDCE_CODE et un peu plus de 13 000 dans COMPLEMENTARY_DATA.

    Ensuite, il fait une requete de sélection que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * 
    FROM GENERATED_MESSAGE 
    LEFT JOIN COMPLEMENTARY_DATA 
    ON GENERATED_MESSAGE.id_id_gme = COMPLEMENTARY_DATA.id_id_gme 
    JOIN FDCE_CODE 
    ON GENERATED_MESSAGE.id_id_gme = FDCE_CODE.id_id_gme 
    WHERE GENERATED_MESSAGE.int_id_syb = 1
    AND GENERATED_MESSAGE.sid_side_bas = 8
    AND GENERATED_MESSAGE.fmc_code_fau = 112
    J'ai à peu près 150 enregistrements de remontés via cette requete.

    Ma requete prend 1,6 secondes en InnoDb pour la premiere execution (ensuite, le innodb_buffer_pool est utilisé donc les executions suivantes prennent moins de 1 ms) alors qu'en MyISAM ça prend 120 ms.
    Mon index est utilisé pour optimiser la requete.

    Je me demande ce qui cloche pour mon premier SELECT en InnoDB car je trouve 1,6s ça fait long pour ma requete. Qu'en pensez-vous?
    La machine sur laquelle on teste est dédiée et a un proc Core 2 Duo 6320 1,86 GHz et 2Go RAM.

    Je suis en MySQL 4.1.22 et mon fichier my.cnf ne contient aucun parametrage particulier pour InnoDB.

  2. #2
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Perso je ne trouve pas que 1.6s soit très long pour des jointures sur des tables contenant autant de ligne.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut
    Comment expliquer pourtant le temps de 120 ms en MyISAM par rapport aux 1,6s de InnoDB?

    Par ailleurs, j'ai fait un test InnoDB sans mettre d'index sur GENERATED_MESSAGE et j'ai un résultat de 1,8s...

    Cela confirme bien que le temps de 1,6s en InnoDB avec index sur GENERATED_MESSAGE n'est pas normal, non?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    Non c'est clair qu'avec des si petits volumes, c'est complétement anormal d'avoir 1,6 secondes.

    Peux tu faire un explain sur la requete qu'on voit où il passe?

  5. #5
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut
    Voici la sortie du EXPLAIN pour la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >> 1	SIMPLE	GENERATED_MESSAGE	ref	PRIMARY,gme_index	gme_index	10	const,const,const	162	Using where	
    >> 1	SIMPLE	COMPLEMENTARY_DATA	ref	cd_index	cd_index	4	Bench.GENERATED_MESSAGE.id_id_gme	1		
    >> 1	SIMPLE	FDCE_CODE	ref	fdecode_index	fdecode_index	4	Bench.GENERATED_MESSAGE.id_id_gme	1

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Pourquoi faire un produit cartésien (JOIN) sur FDCE_CODE ? Le mot clef JOIN tout seul équivaut à un CROSS JOIN, c'est à dire un produit cartésien (et la condition de jointure derrière ne sert à rien...). Et ça donne 88 000 lignes par 88 000 lignes, ce qui explique très certainement le temps de traitement...

    Remplace le JOIN par un INNER JOIN, et ça devrait aller mieux .

    ced

  7. #7
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut
    J'ai mis un INNER JOIN et ça ne va pas mieux, j'ai grosso modo le meme temps : 1,6s à 80 ms près.

    Voici le EXPLAIN pour la requete avec l'INNER JOIN :
    edit : c'est le meme EXPLAIN que pour la requete avec JOIN tout court

  8. #8
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut
    Il me semble que par défaut, innodb_buffer_pool_size est égal à 8M.
    Enfin c'est ce que je viens de comprendre.

    En le passant à 16M : ma requete prend 400 ms
    En le passant à 24M : ma requete prend 7 ms


    Avec 8M de cache (et donc des accès disques pour ma requete), vous trouvez normal que ma requete prenne 1.6s?

  9. #9
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut
    Si je teste ma requete de sélection sur d'autres triplés {int_id_syb, sid_side_bas, fmc_code_fau}, j'ai des variations importantes dans mes résultats.

    Dans des cas ou j'ai 20 enregistrements remontés, ma requete prend moins de 20ms.

    Je pense que le problème de lenteur de ma requete précédente vient de mon exemple en lui-meme : répartition des données pas idéale => index sans effet sur les perfs dans mon exemple?

    Est-ce qqun a une url ou qq chose (une doc ou des graphes) avec les performances de mysql sur plusieurs requetes?

  10. #10
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 42
    Points : 40
    Points
    40
    Par défaut
    J'ai essayé un nouveau truc dans mon programme

    -un premier scénario avec connexion à la base, un drop tables, create tables, insert des données, puis ma requete select, qui prend 1,6s.

    -un deuxieme scénario dit "base déjà existante" avec juste une connexion à la base puis ma requete select, qui là prend 100 ms.

    Des explications??

Discussions similaires

  1. [Optimisation] Delete beaucoup plus lent que select
    Par GyZmoO dans le forum Requêtes
    Réponses: 17
    Dernier message: 18/07/2017, 19h08
  2. Requête SELECT lente
    Par Fiilou dans le forum MySQL
    Réponses: 18
    Dernier message: 05/05/2015, 15h02
  3. Select lent voire impossible
    Par rungis78-76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/11/2014, 11h11
  4. [Oracle 10g]INSERT SELECT lent
    Par Giill dans le forum Oracle
    Réponses: 2
    Dernier message: 22/05/2006, 17h18

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