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 :

Requête lente que ne n'arrive pas à optimiser


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut Requête lente que ne n'arrive pas à optimiser
    Bonsoir,
    en épluchant un peu mon log des requêtes lentes, je découvre avec stupeur que celle-ci y est présente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT _acteurs.act_cleunik as act_cleunik, _act_interlo.int_cleunik as int_cleunik, _acteurs.raisonsoc as raisonsoc, _acteurs.nomcommercial as nc, _act_interlo.actif,_acteurs.codealphanum15,_acteurs.mnemotechnique,_acteurs.typeacteur,_acteurs.blocnotebrut as acteur_bn,_act_interlo.blocnotebrut as interlo_bn from _act_interlo,_acteurs where _act_interlo.act_cleunik=_acteurs.act_cleunik;
    Je fais un explain dessus et en effet je constate avec stupeur que dans ma colonne type j'ai "ALL"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1, 'SIMPLE', '_act_interlo', 'ALL', 'act_cleunik', '', '', '', 27355, ''
    1, 'SIMPLE', '_acteurs', 'ref', 'act_cleunik', 'act_cleunik', '9', 'test._act_interlo.act_cleunik', 1, 'Using where'
    Je fais un essai avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT _acteurs.act_cleunik as act_cleunik, _act_interlo.int_cleunik as int_cleunik, _acteurs.raisonsoc as raisonsoc, _acteurs.nomcommercial as nc, _act_interlo.actif,_acteurs.codealphanum15,_acteurs.mnemotechnique,_acteurs.typeacteur,_acteurs.blocnotebrut as acteur_bn,_act_interlo.blocnotebrut as interlo_bn from _act_interlo join _acteurs using act_cleunik;
    mais même chose.
    Je précise que act_cleunik est clé unique dans _acteur et index dans _act_interlo et que je suis en Mysql 5.0.41

    Et je sèche car je ne vois vraiment pas comment optimiser !!

    D'avance, merci pour vos lumières
    Cordialement,
    Christophe Charron

  2. #2
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Si MySQL choisit de faire un ALL sur la table act_cleunik c'est que cette table doit contenir moins d'elements que _acteurs non ?

    il faudrait connaitre la volumetrie de ces tables.

    De toute facon votre requete entrainera forcement une lecture complète d'une des tables.

    Etes vous sur que act_cleunik est une clé primaire ???
    Pouvez vous donner les scripts des 2 tables ?
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  3. #3
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Bonjour,
    la table acteur est décrite comme suit
    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
     
    CREATE TABLE  `_acteurs` (
      `act_cleunik` bigint(20) default NULL COMMENT 'Clé Unik',
      `codealphanum15` varchar(15) default NULL COMMENT 'Code Type Notes',
      `raisonsoc` varchar(100) default NULL COMMENT 'Raison Sociale',
      `nomcommercial` varchar(100) default NULL COMMENT 'Nom commercial',
      `siret` varchar(23) default NULL COMMENT 'SIRET/SIREN',
      `blocnotebrut` longtext COMMENT 'Bloc Note brut pour recherche',
      `blocnotertf` longtext COMMENT 'Bloc note au format RTF',
      `dateheuremodif` datetime default NULL COMMENT 'Date/Heure de modification',
      `dateheurevalidite` datetime default '2061-01-23 12:00:00' COMMENT 'Date de "péremption"',
      `dateheurecreation` datetime default NULL COMMENT 'Date/Heure de modification',
      `typeacteur` bigint(20) default NULL COMMENT 'Type dacteur',
      `c_uuid` varchar(36) NOT NULL default '',
      `mnemotechnique` varchar(20) default NULL COMMENT 'Identification mnémotechnique',
      `modegestion` bigint(20) default '121500' COMMENT 'Mode de gestion',
      `actif` tinyint(4) default '1' COMMENT 'Acteur actif 1->Oui, 2->Non',
      `devise` bigint(20) default '122047' COMMENT 'Devise privilégiée de l''acteur',
      UNIQUE KEY `act_cleunik` (`act_cleunik`),
      KEY `raisonsoc` (`raisonsoc`),
      KEY `nomcommercial` (`nomcommercial`),
      KEY `siret` (`siret`),
      KEY `typeacteur` (`typeacteur`),
      KEY `FK__acteurs_1` (`modegestion`),
      KEY `FK__acteurs_2` (`devise`),
      KEY `Index_8` (`actif`),
      CONSTRAINT `FK__acteurs_1` FOREIGN KEY (`modegestion`) REFERENCES `_choix` (`choix_cleunik`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `FK__acteurs_2` FOREIGN KEY (`devise`) REFERENCES `_choix` (`choix_cleunik`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Acteur';
    et comporte 27268 acteurs et la table des interlocuteurs décrite comme suit
    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
    CREATE TABLE  `_act_interlo` (
      `int_cleunik` bigint(20) default NULL COMMENT 'Clé unique interlocuteur',
      `codealphanum15` varchar(15) default NULL COMMENT 'Code Type Notes',
      `act_cleunik` bigint(20) default NULL COMMENT 'Clé unique acteur',
      `patronyme` varchar(100) default NULL COMMENT 'Nom',
      `blocnotebrut` longtext COMMENT 'Bloc Note brut',
      `prenom` varchar(100) default NULL COMMENT 'Prénom',
      `blocnotertf` longtext COMMENT 'Bloc notes RTF',
      `dateheuremodif` datetime default NULL COMMENT 'Date de création/modification',
      `infodefaut` tinyint(4) default NULL COMMENT 'Contact principal',
      `dateheurevalidite` datetime default NULL COMMENT 'Date de péremption',
      `choix_cleunik` bigint(20) default NULL COMMENT 'Civilité (Clé unique table choix )',
      `actif` tinyint(4) default '1' COMMENT 'Interlocuteur actif : 1 -> Oui, 2 Non',
      UNIQUE KEY `int_cleunik` (`int_cleunik`),
      KEY `codealphanum15` (`codealphanum15`),
      KEY `act_cleunik` (`act_cleunik`),
      KEY `patronyme` (`patronyme`),
      KEY `choix_cleunik` (`choix_cleunik`),
      CONSTRAINT `contrainte_cli_interlo_choix` FOREIGN KEY (`choix_cleunik`) REFERENCES `_choix` (`choix_cleunik`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `contrainte_interlo_cli_act_cli` FOREIGN KEY (`act_cleunik`) REFERENCES `_acteurs` (`act_cleunik`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Interlocuteurs d\'acteur';
    avec 27206 enregistrements

    J'avais simplifié la requête, pour tenter de déterminer les paramètres de lenteur. La vraie est en fait celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT _acteurs.act_cleunik as act_cleunik, _act_interlo.int_cleunik as int_cleunik, _acteurs.raisonsoc as raisonsoc, _acteurs.nomcommercial as nc, _choix.choix_valeur_texte_01 as civilite, concat_ws(' ',_act_interlo.prenom,_act_interlo.patronyme) as qui, _choixact.choix_valeur_texte_01 as portee,_act_interlo.actif,_acteurs.codealphanum15,_acteurs.mnemotechnique,_acteurs.typeacteur,_acteurs.blocnotebrut as acteur_bn,_act_interlo.blocnotebrut as interlo_bn from _acteurs,_act_interlo,_choix,_choix _choixact  where _acteurs.act_cleunik = _act_interlo.act_cleunik and _choixact.choix_cleunik = _acteurs.typeacteur and _choix.choix_cleunik = _act_interlo.choix_cleunik and _act_interlo.int_cleunik in (SELECT _act_interlo_favoris.int_cleunik from _act_interlo_favoris where _act_interlo_favoris.uti_cleunik=1 and _act_interlo_favoris.genre=1) order by qui
    Cordialement,
    Christophe Charron

  4. #4
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Plusieurs choses sur votre requete.

    le fait d'utiliser la fonction de concaténation va réduire vos performances (n'est il pas possible pour vous de laisser les champs tel quel dans le select ?).
    De plus le ORDER BY n'utilisera pas vos index puisqu'il est fait sur un champ variable.
    Le WHERE IN est toujours plus pénalisant qu'un bon vieux EXISTS

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  5. #5
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    C'est pour cela que j'avais simplifié au maximum la requête.
    Mais malgré cela, je ne comprends toujours pas pourquoi Mysql ne propose pas d'index!!!
    Cordialement,
    Christophe Charron

Discussions similaires

  1. une requête que je n'arrive pas à faire marcher
    Par JeanNoel53 dans le forum Firebird
    Réponses: 8
    Dernier message: 16/12/2013, 09h27
  2. Problême sql server : requête que je n'arrive pas à formuler
    Par yaniss321 dans le forum Développement
    Réponses: 1
    Dernier message: 17/07/2013, 16h53
  3. boucle que je n'arrive pas à réaliser...
    Par mussara dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 12h24
  4. Une requête que je n'arrive pas à faire
    Par Denti-fritz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/12/2005, 13h53
  5. problème que je n'arrive pas à résoudre de façon récursive
    Par miam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 31/07/2004, 11h21

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