Différences entre les versions de « Mysql analyse queries »

De BlaxWiki
Aller à la navigationAller à la recherche
(Page créée avec « <pre> e nouveau, 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ém... »)
 
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
<pre>
<pre>
e nouveau, nous nous retrouvons cofrontés à des problèmes de performances de MySQL2.
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.
En y regardant de plus près, et après avoir migrés certains clients "problématiques", d'autres ont apparament pris le relais.


Ligne 7 : Ligne 7 :
A titre d'exemple voici le client ulysse qui envoie régulièrement des requêtes "lourdes" :
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;
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                    |
| id | select_type | table              | type  | possible_keys | key        | key_len | ref                                                    | rows | Extra                    |
Ligne 21 : Ligne 25 :
En modifiant la requête, on peut significativement en améliorer les perfs & temps d'exécution :
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;
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                    |
| id | select_type | table              | type  | possible_keys | key        | key_len | ref                                                    | rows | Extra                    |

Version actuelle datée du 30 janvier 2013 à 11:50

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.