Mysql analyse queries
De BlaxWiki
Révision datée du 30 janvier 2013 à 11:50 par Admin (discussion | contributions) (a déplacé Mysql Analyse queries vers Mysql analyse queries)
Nous nous retrouvons cofrontés à des problèmes de performances de MySQL2. En y regardant de plus près, et après avoir migrés certains clients "problématiques", d'autres ont apparament pris le relais. Souvent, les requêtes de ces clients utilisent des jointures entre des tables de manière non appropriées : LEFT/RIGHT JOIN inadapté etc... A titre d'exemple voici le client ulysse qui envoie régulièrement des requêtes "lourdes" : mysql> explain SELECT annonceur.SocietesNumAuto FROM ciel AS annonceur LEFT JOIN x_dossiers_annonces ON x_dossiers_annonces.DossiersAnnoncesSocietesNum=annonceur.SocietesNumAuto LEFT JOIN x_dossiers_etapes ON x_dossiers_etapes.EtapesNum=x_dossiers_annonces.DossiersAnnoncesEtapesNum LEFT JOIN OIStatut ON OIStatut.statutNum=x_dossiers_annonces.DossiersAnnoncesOIStatutNum WHERE x_dossiers_etapes.EtapesNum=70; +----+-------------+---------------------+--------+---------------+-------------+---------+--------------------------------------------------------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------------------+--------+---------------+-------------+---------+--------------------------------------------------------+------+--------------------------+ | 1 | SIMPLE | x_dossiers_etapes | ref | DossierFNum | DossierFNum | 4 | const | 1 | Using where; Using index | | 1 | SIMPLE | annonceur | index | NULL | PRIMARY | 4 | NULL | 4091 | Using index | | 1 | SIMPLE | x_dossiers_annonces | ALL | NULL | NULL | NULL | NULL | 1138 | Using where | | 1 | SIMPLE | OIStatut | eq_ref | PRIMARY | PRIMARY | 4 | ulysse.x_dossiers_annonces.DossiersAnnoncesOIStatutNum | 1 | Using index | +----+-------------+---------------------+--------+---------------+-------------+---------+--------------------------------------------------------+------+--------------------------+ cardinalité de la requête = 1 x 4091 x 1138 x 1 = 4.655.558 lignes analysées pour ne renvoyer que "3633" résultats. En modifiant la requête, on peut significativement en améliorer les perfs & temps d'exécution : mysql> explain SELECT annonceur.SocietesNumAuto FROM ciel AS annonceur INNER JOIN x_dossiers_annonces ON x_dossiers_annonces.DossiersAnnoncesSocietesNum=annonceur.SocietesNumAuto INNER JOIN x_dossiers_etapes ON x_dossiers_etapes.EtapesNum=x_dossiers_annonces.DossiersAnnoncesEtapesNum INNER JOIN OIStatut ON OIStatut.statutNum=x_dossiers_annonces.DossiersAnnoncesOIStatutNum WHERE x_dossiers_etapes.EtapesNum=70; +----+-------------+---------------------+--------+---------------+-------------+---------+--------------------------------------------------------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+---------------------+--------+---------------+-------------+---------+--------------------------------------------------------+------+--------------------------+ | 1 | SIMPLE | x_dossiers_etapes | ref | DossierFNum | DossierFNum | 4 | const | 1 | Using where; Using index | | 1 | SIMPLE | x_dossiers_annonces | ALL | NULL | NULL | NULL | NULL | 1138 | Using where | | 1 | SIMPLE | annonceur | eq_ref | PRIMARY | PRIMARY | 4 | ulysse.x_dossiers_annonces.DossiersAnnoncesSocietesNum | 1 | Using index | | 1 | SIMPLE | OIStatut | index | PRIMARY | PRIMARY | 4 | NULL | 4 | Using where; Using index | +----+-------------+---------------------+--------+---------------+-------------+---------+--------------------------------------------------------+------+--------------------------+ cardinalité de la requête = 1 x 1138 x 1 x 4 = 4.552 lignes analysées pour ne renvoyer que "3633" résultats. Il faudrait continuer à aider les clients à optimiser leurs requêtes ou alors leur proposer un outil qui leur permet d'évaluer la performance de leur requête.