Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/12/2018, à 20:10

Carabistouille

Mysql 8.0 : perte de performance

Bonjour à tous,

Je reprends la programmation après... 10 ans d'interruption smile

Je suis en train de créer un applicatif pour lequel je reçois des données normalisées dans un format quasi CSV (le séparateur est un pipe |). Les fichiers font en moyenne un million et demi de lignes et je dois opérer des tris, classements et calculs sur les différents champs (15).

Mon applicatif est en python et j'ai trouvé que le temps de traitement par python de tels volumes était trop lent. J'ai donc décidé de charger mes données dans une base de données et de déléguer les traitements sur les données à SQL.

Pour envoyer mes données dans la base de données, j'utilise la requête suivante :

"LOAD DATA LOCAL INFILE filename IGNORE INTO TABLE  tablename CHARACTER SET utf8 FIELDS TERMINATED BY '|' IGNORE 1 LINES (champ1,champ2,champ3,...., champ15)"

J'ai commencé à développer cet applicatif avec Mysql 5.7. La commande fonctionnait de façon tout à fait satisfaisante.

Pour un fichier de 1,5 millions de ligne, mon pc le chargeait en 15 secondes et les opérations réalisées par la suite sur la table (select, update etc...) étaient réalisées très rapidement. Pendant le traitement de la requête load data, le CPU ne montait pas à plus de 20%.

Souhaitant utiliser les nouvelles fonctionnalités de Mysql 8 (regex_replace et les fonctions de fenetrage notamment) j'ai upgradé vers cette nouvelle version.

Depuis je constate une perte de performance dramatique sur mes opérations dès qu'elles dépassent une certaine taille :

- lors de l'import du même fichier qu'auparavant, le CPU monte à 90% et l'opération prend plus de deux minutes (contre 15 sec auparavant) ;

- les opérations ultérieures (select par exemple) prennent un temps fou (plus de 10 fois ce qui était requis avec mysql 5.7, avec à chaque fois une charge de CPU délirante à plus de 80%).

Je n'ai rien trouvé dans la doc mysql sur la source potentielle de ce ralentissement flagrant. Sur mysql 8.0 la fonction load data est désactivée par défaut mais j'ai bien pris soin de la réactiver.

J'ai déjà détecté une source de ralentissement (que je ne comprends pas) en mettant MYISAM en engine par défaut plutot que INNODB, le temps de traitement ne met plus que 6 fois plus de temps au lieu de plus de 8 fois ^^ (INNODB est devenu le moteur par défaut avec MYSQL8.0).

Si quelqu'un a une idée, je suis preneur parce que je me prends la tête avec cette histoire depuis déjà deux jours smile

Un million de lignes ça commence à faire une belle table, mais à mon avis rien qui puisse justifier que la version 8.0 patine dans la semoule comme ça.

Cara'

Dernière modification par Carabistouille (Le 09/12/2018, à 20:11)

Hors ligne