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

MySQL Discussion :

Quelle optimisation possible pour ma requête ?


Sujet :

MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Quelle optimisation possible pour ma requête ?
    Bonjour,

    Je cherche à optimiser le temps de réponse de ma requête.
    J'attaque une base MySql 5.6.20 (table en InnoDb) avec php et lance une requête simple :

    Voici la table :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    CREATE TABLE `documents` (
      `Id` int(10) NOT NULL AUTO_INCREMENT,
      `A_TypeDocument` varchar(12) NOT NULL COMMENT 'TYPOLOGIE',
      `A_DateTrt` varchar(10) NOT NULL COMMENT 'DATE TRAITEMENT',
      `A_Machine` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'MACHINE',
      `A_NumTrans` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'TRANSACTION',
      `A_Sequence` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'SEQUENCE',
      `A_CodeEmetteur` varchar(6) NOT NULL,
      `A_CodeEtablissement` varchar(12) DEFAULT NULL,
      `A_CodeCentreTip` varchar(6) DEFAULT NULL,
      `A_RefOp` varchar(24) NOT NULL DEFAULT '',
      `A_NumFormule` varchar(20) NOT NULL DEFAULT '0',
      `A_CodeRib` varchar(2) NOT NULL DEFAULT '0',
      `A_CodeBanque` varchar(5) NOT NULL DEFAULT '',
      `A_CodeGuichet` varchar(5) NOT NULL DEFAULT '',
      `A_Compte` varchar(12) NOT NULL,
      `A_CleRib` varchar(10) NOT NULL DEFAULT '',
      `A_Intitule` varchar(30) NOT NULL DEFAULT '',
      `A_NumSerie` varchar(10) NOT NULL DEFAULT '',
      `A_Zib` varchar(12) NOT NULL DEFAULT '',
      `A_CompteCHQ` varchar(12) NOT NULL DEFAULT '0',
      `A_RefMandat` varchar(18) NOT NULL DEFAULT '',
      `A_Montant` varchar(16) NOT NULL DEFAULT '0',
      `A_Statut` int(10) unsigned NOT NULL DEFAULT '0',
      `A_RejetOptique` varchar(10) NOT NULL DEFAULT '',
      `A_CodeTraitement` int(10) unsigned NOT NULL DEFAULT '0',
      `A_Origine` varchar(4) NOT NULL DEFAULT '',
      `A_NumLot` varchar(4) NOT NULL DEFAULT '',
      `A_Nom` varchar(60) NOT NULL DEFAULT '',
      `A_Prenom` varchar(60) NOT NULL DEFAULT '',
      `A_Adresse1` varchar(65) NOT NULL DEFAULT '',
      `A_Adresse2` varchar(65) NOT NULL DEFAULT '',
      `A_CodePostal` varchar(26) NOT NULL DEFAULT '',
      `A_Ville` varchar(20) NOT NULL DEFAULT '',
      `A_NumChrono` decimal(9,0) NOT NULL DEFAULT '0',
      `A_RefImageRecto` varchar(150) NOT NULL DEFAULT '',
      `A_RefImageVerso` varchar(150) NOT NULL DEFAULT '',
      `A_NumPortefeuille` varchar(10) NOT NULL DEFAULT '',
      `A_IntituleCHQ` varchar(30) NOT NULL DEFAULT '',
      `A_CodeBqSaisie` varchar(21) NOT NULL DEFAULT '',
      `A_CompteCHQSaisie` varchar(21) NOT NULL DEFAULT '0000-00-00 00:00:00',
      `A_DateOrigine` varchar(12) DEFAULT NULL COMMENT 'WKF: Date Origine (SSAAMMJJ)',
      `A_DateDecision` varchar(12) DEFAULT NULL COMMENT 'WKF: Date decision (SSAAMMJJ)',
      `A_StatutWkf` varchar(16) NOT NULL DEFAULT '0' COMMENT 'WKF: 0=Normal-1=Retour WKF valide 2=Rejet',
      `A_Flag01` varchar(1) NOT NULL DEFAULT '0' COMMENT 'WKF: Hors Fourchette',
      `A_Flag02` varchar(1) NOT NULL DEFAULT '0' COMMENT 'WKF: Reference',
      `A_Flag03` varchar(1) NOT NULL DEFAULT '0' COMMENT 'WKF: Code Traitement',
      `A_Flag04` varchar(1) NOT NULL DEFAULT '0' COMMENT 'WKF: Anomalie',
      `A_FlagMANDAT` varchar(1) NOT NULL DEFAULT '0' COMMENT 'WKF: Mandat',
      `A_WorkFlow` varchar(25) NOT NULL DEFAULT '0',
      `A_DateInsert` varchar(22) NOT NULL DEFAULT '',
      `A_NomFicInsert` varchar(100) NOT NULL DEFAULT '0000-00-00 00:00:00',
      `TimeStamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`Id`),
      KEY `IX_PK` (`A_DateTrt`,`A_Machine`,`A_NumTrans`,`A_Sequence`,`A_CodeEmetteur`),
      KEY `IX_DATETRT` (`A_DateTrt`),
      KEY `IX_TYPO` (`A_TypeDocument`),
      KEY `IX_REFOP` (`A_RefOp`),
      KEY `IX_TRS` (`A_NumTrans`,`A_Sequence`),
      KEY `IX_DATEORIGINE` (`A_DateOrigine`),
      KEY `IX_EMETTEUR` (`A_CodeEmetteur`),
      KEY `IX_STATUSWF` (`A_StatutWkf`),
      KEY `IX_MNT` (`A_DateTrt`,`A_Montant`) USING BTREE,
      KEY `IX_NUMSERIE` (`A_DateTrt`,`A_NumSerie`) USING BTREE,
      KEY `UNIQUE` (`A_DateTrt`,`A_Machine`,`A_NumTrans`,`A_TypeDocument`) USING BTREE,
      KEY `IX_BQUE` (`A_CodeBanque`),
      KEY `IX_GUI` (`A_CodeGuichet`),
      KEY `IX_ZIB` (`A_Zib`),
      KEY `IX_PRTF` (`A_NumPortefeuille`),
      KEY `IX_NUMLOT` (`A_NumLot`) USING BTREE,
      KEY `IX_MAC` (`A_Machine`,`A_NumTrans`,`A_Sequence`),
      KEY `IX_SEQ` (`A_Sequence`),
      KEY `IX_CPTECHQ` (`A_CompteCHQ`)
    ) ENGINE=InnoDb AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    Il y à 5 000 000 d'enregistrements. Voici la requête lancée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from documents where A_CodeGuichet='001122' order by a_datetrt
    Cette requête me ramène environ 12 000 enregistrements.

    Elle dure 15 secondes à s'exécuter depuis le php et 12 secondes depuis MySql

    Pensez-vous que ce temps de réponse est correct et si non, ma requête est-elle optimisable?

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 924
    Points : 51 726
    Points
    51 726
    Billets dans le blog
    6
    Par défaut
    Une requête ne s'optimise pas....
    Une base de données oui !
    Pour cela il faudrait que votre base ait été correctement modélisée. or ce n'est visiblement pas le cas. Votre table est une table obèse et si vous voulez des performances, il faut impérativement casser votre table en respectant au minimum les 3 premières formes normales !

    A me lire : http://blog.developpez.com/sqlpro/p1...mances_petites

    A +

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Oui je comprends qu'il y a trop de champs, c'est bien cela ?
    L'idée étant de gérer n tables ?

    Le lien ne fonctionne pas chez moi : A me lire : http://blog.developpez.com/sqlpro/p1...mances_petites

    Merci

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Le lien fonctionne désolé
    Je le lis avec délectation

    Merci

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 924
    Points : 51 726
    Points
    51 726
    Billets dans le blog
    6
    Par défaut
    En plus vous avez la malchance d'être sous MySQL dont les performances sont généralement les plus mauvaises parmi tous les SGBDR (Oracle, SQL Server, IBM DB2, Sybase, PostGreSQL...)

    A +

  6. #6
    Futur Membre du Club
    Inscrit en
    Août 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Super intéressant ce Tuto.

    Merci, je comprends mieux mon souci.

    Oui MySql sûrement moins performant lors d'une course, affrontant les 3 meilleurs coureurs du monde, ce n'est pas par ce que le 3ème arrive 3ème qu'il est mauvais pour autant


    Merci pour vos réponses je vais réviser ma copie et du coup progresser encore un peu plus.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 924
    Points : 51 726
    Points
    51 726
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par timousse Voir le message
    Oui MySql surement moins performant Lors d'une course, affrontant les 3 meilleurs coureurs du monde, ce n'est pas par ce que le 3ème arrive 3ème qu'il est mauvais pour autant
    Je n'avais pas dit qu'il était mauvais... Mais nettement moins performant.
    Lisez le benchmark que je me suis amusé à faire : http://blog.developpez.com/sqlpro/p9...alles_en_sql_1
    Voyez les performances qui vont du ridicule au catastrophique avec MySQL !

    En sus il est réellement TRES TRES mauvais avec son SQL limité à la version 1986 ! (pas de schéma SQL, pas de contraintes CHECK, pas de CTE, pas de fonction de fenêtrage, pas de requêtes récursives...) et en sus une quantité de bugs impressionnants rarement corrigés !
    A me lire : http://blog.developpez.com/sqlpro/p9...oudre_aux_yeux

    A +

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/12/2014, 14h36
  2. Réponses: 5
    Dernier message: 25/03/2010, 22h14
  3. Quelle optimisation en taille d'écran pour les sites
    Par JeanMi66 dans le forum Webdesign & Ergonomie
    Réponses: 26
    Dernier message: 16/09/2008, 22h37
  4. Sous-Sous-Requête: Optimisation possible ?
    Par FMaz dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/04/2008, 04h49
  5. quelle fonction pour ma requête
    Par ideal23 dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/01/2007, 13h32

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