Mysql analyse queries

De BlaxWiki
Aller à la navigationAller à la recherche
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.