Bonjour.
J'ai un problème de lenteur avec un serveur mysql. Ce serveur utilisé en production contient de nombreuses tables et informations : bureau d'études, GPAO, production, RH, .....
Les performances sont tout a fait satisfaisante sauf lors d'un calcul qui s'exécute toutes les 10 minutes et qui prend a peu prés une minutes.
Durant ce calcul tout les programmes de la société sont ralenti avec des temps de réponse qui explosent.
Le fautif utilise de nombreuses tables pour faire ses calculs dont certaines sont assez grosses. Le calcul se déroule ainsi : on prend une table que l'on copie dans une table temporaire, puis on utilise de nombreuses informations d'autres table pour modifier la table temporaire, une fois fini on réinjecte la table temporaire dans la table d'origine après l'avoir vidé. Je dis ceci pour dire qu'il est difficile d'externaliser ce calcul vue qu'il dépend de nombreuses.
Au niveau matériel le serveur est un DELL 1800 xeon double coeur avec une debian et 2 giga de ram et du Raid 5 en disque dur. Les tables sont au format MyISAM.
J'ai essayer de voir s'il y avait la possibilité de faire tourner ce calcul sur un deuxième serveur puis de renvoyer le résultat sur le premier mais cela nécessite d'avoir un deuxiéme serveur synchronisé avec le premier avec les logs binaires (que nous n'avons pas pour le moment). le problème c'est que le transfert de la table en question d'un serveur a l'autre prend beaucoup de temps et ralenti le serveur autant que la calcul lui même (alors qu'en restant sur le même serveur c'est rapide).
J'avoue être avoir besoin d'idée pour essayer d 'améliorer les performances. Si il faut en passer par du nouveau matériel ou autre c'est envisageable mais je pense pas que ça puisse régler grand chose.
Merci d'avance.
# petites pistes
Posté par Matthieu . Évalué à 2.
--> Il est possible d'augmenter la variable mysql : SET global tmp_table_size=1000000000;
--> ou il est aussi possible de créer manuellement cette table temporaire, en mémoire, en précisant le TYPE HEAP lors du CREATE.
--> Si tes requêtes pour générer cette table temporaire impliquent beaucoup de jointures, ça vaudra le coup de passer les tables originelles concernées par lesdites jointures en InnoDB
--> Tu sembles dire que ton serveur de BDD gère de nombreuses tables, peut-être même plusioeurs bases de données ; as-tu déja vérifié que ton Mysql profite bien de toute la RAM, et pensé à ajouter une barette?
# indexation...
Posté par ragoutoutou . Évalué à 2.
Par le passé, au boulot, j'ai déjà vu des traitements prendre 20x à 100x moins de temps après un profiling des requêtes et adaptation des indexes, particulièrement en cas de join sur des champs multiples.
L'optimisation de la DB est potentiellement l'action qui fera gagner les plus de perfs (au détriment de l'espace de stockage, il est vrai)...
Après, un clustering complet multi-maître serait peut-être à envisager
# Slave ou innodb
Posté par peck (site web personnel) . Évalué à 2.
Sinon la technique du slave est très bien puisqu'elle décharge complètement de la tâche :
- Mettre en place la réplication : plutot facile, le manuel mysql a un chapitre bien expliqué pour ça
- Le script tourne sur le slave, fait sa table temporaire sur le slave, surcharge le slave
- La table temporaire doit être recopiée sur le master et la ça peut être un peu lourd, il faut voir la taille.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.