|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Bonjour à tous.
Voila mon problème : Je bosse sur Mysql 5.1.53, installée sur une Opensuse 11.4 qui tourne en virtualisation sur un serveur. Depuis quelques temps, j'ai un problème tout à fait nouveau qui se pose : une de mes requêtes à un temps d’exécution très très très variable : elle peut mettre de 1 seconde à plusieurs minutes pour s'executer ! Et cela indépendemment de la charge sur le serveur. Autre remarque, juste après un redémarrage de Mysqld, elle s'execute systématiquement 1 seconde, plusieurs fois sir je la relance, juqu'au moment ou elle mettre plus d'1 minute, à partir de cette fois la ou elle mettra systématiquement plusieurs minutes. Le truc incroyable, c'est que cela se produit aussi bien sur mon serveur de test que sur mon serveur en prod....qui est bien plus puissant. Autre chose remarquable, lors de temps d'execution très long, je remarque en suivant un SHOW PROCESSLIST, que la requete se relance toute seule 1 fois car le temps d'éxcution retombe à 0 puis repart jusqu'a plusieurs minutes. Voici les temps d'execution de la meme requete : Code :
Auriez vous des pistes de recherche, que vérifier sur le serveur MYSQL, etc...car la je bloque, je n'ai jamais eu ça en plusieurs années d'utilisation de MYSQL ! Merci d'avance !
|
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Qu'une requête passe d'un temps d'exécution long à un temps d'exécution court est normal car, si les données impliquées n'ont pas changé entre les deux appels, le résultat est encore en mémoire et le SGBD ne ré-exécute pas la requête, il se contente de redonner le résultat.
Par contre l'inverse est plus étonnant, surtout dans ces proportions. Quant au fait que la requête "se relance toute seule", ça me semble impossible ! Ça doit venir du programme qui lance la requête. On peut voir la requête ? Et éventuellement le bout de programme qui la lance ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#3 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
De plus c'est une particularité MySql, je pense qu'il est également possible de mémoriser le résultat d'une requète sur d'autres SGBD (Oracle a en version 11G un query result cache) mais c'est généralement manuel, en tout cas ce n'est pas un comportement de base n'y souhaitable pour toutes les requètes executées. Par contre les données sont remontées en cache lors de la 1ere exécution (si elle n'y sont pas déjà), lors de la 2eme exécution de la requette le SGBD accède aux données en cache (IO logique) et évite ainsi des accès physiques au disque (IO physique), c'est donc plus performant. PS : 1.2 sec pour retourner aucune ligne, je ne suis pas sûr que le résultat de la requête soit en cache. |
|
|
|
00
|
|
|
#4 | |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Citation:
Moi aussi, mais ce que je constate c'est que le temps d'exécution de la requête monte, puis repart à 0 (avec le même process ID !), remonte jusqu'à encore plus haut et elle se termine. Je vous montre le résultat dès que possible, mais effectivement les temps d’exécution changent à chaque fois, donc la requête est bien ré effectuée à chaque fois. Je pense qu'il y a quelquechose de "pourri" sur cette table, car je l'ai créee à partir du dump de mon serveur prod sur lequelle le problème est le même (mais dans des proportions différentes, le serveur étant nettement plus performant. Je ne connais pas le querycache, je vais me pencher sur cela skuatamad. |
|
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Voici la requête incriminée :
Code :
COORDS_ARRET.arret pointe l'ID de ARRET ARRET.journee pointe ARRET de JOURNEE JOURNEE.interv pointe ID de INTERVENANT_DALYO |
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Yannick Ingénieur Etudes & Developpements Inscription : février 2006 Messages : 1 125 ![]() |
Avez vous analysé le plan d'execution ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac) |
|
|
00
|
|
|
#7 | ||
![]() ![]() |
Rien d'extraordinaire dans cette requête. Quelques remarques cependant :
1) Les jointures s'écrivent depuis 1992 avec le mot-clé JOIN ; il serait temps de s'y mettre ! 2) "id" est le nom généralement employé pour "identifiant" et constitue le plus souvent la clé primaire de la table. Si c'est bien le cas ici, comment la colonne "arret.id" pourrait-elle être vide ? La condition sur cette colonne est peut-être superflue. 3) Si arret.type est de type numérique, comme le laissent supposer les valeurs testées, inutile de mettre ces valeurs entre apostrophes. 4) Il serait mieux de mettre des alias pour les tables et d'utiliser ces alias dans toute la requête. Ça simplifie la lecture de la requête et ça évite au SGBD, et au lecteur de la requête de chercher d'où vient chaque colonne. La requête récrite en tenant compte des remarques et à compléter : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#8 | ||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
OK, effectivement je suis d'accord pour les jointures, merci pour la correction de la requête (on est d'accords que telle que je l'ai mise elle n'est pas optimisée). En tous cas le résultat est le même avec une requête propre; dans tous les cas en temps "normal", la requête met même parfois moins d'une seconde à s'exécuter
Je pensais que c'était plus lisible sans alias...je le note. Le champ ID de la table arret n'est pas un numérique, mais un identifiant constitué de 4 groupes de 4 charactères, (XXXX-XXXX-XXXX-XXXX); ces lignes proviennent d'une autre base de données dont je récupère les données mais qui n'est pas gérée par moi. En ce qui concerne la question de la relance de la requete : Code :
En outre, un EXPLAIN de la requête ne m'indique rien de particulierement remarquable. |
||
|
|
00
|
|
|
#9 | |
![]() ![]() |
Citation:
On peut voir l'EXPLAIN ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
|
00
|
|
|
#10 | ||||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Voila :
Code :
Code :
|
||||
|
|
00
|
|
|
#11 |
![]() ![]() |
Je vois qu'il n'y a, semble t-il qu'une clé primaire sur la table "Dalyo.intervenant_dalyo" et qu'elle n'est même pas utilisée. Quelle est cette clé primaire ? N'est-ce pas id ?
Sinon, vu le nombre insignifiant de lignes à traiter, cette requête devrait s'exécuter en largement moins d'une seconde ! On peut avoir le SHOW CREATE TABLE de chaque table ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#12 | ||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Et pourtant ID est bien l'ID de la table intervenant...
Je pensais en fait que dans le EXPLAIN n'étaient mentionnées que les liens de clées étrangères, je n'ai donc pas relevé ce fait la... Et effectivement, cette requête doit s'effectuer en moins d'une seconde, ce qu'elle fait parfois ! Les SHOW CREATE TABLE : Code :
|
||
|
|
00
|
|
|
#13 |
![]() ![]() |
Comme il y a une condition de restriction sur arret.element, arret.type et arret.debut, un index sur ces colonnes pourrait accélérer les choses mais si vraiment il y a si peu de lignes dans la tables, ça ne changera pas grand chose.
Je pense de plus en plus que ce problème de temps variable vient d'ailleurs, même si ça reste bizarre que la clé primaire de la table intervenant_dalyo ne soit pas utilisée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
|
00
|
|
|
#14 | |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Citation:
OK pour les index, j'ai déjà essayé mais ça n'a effectivement pas amélioré les choses... Et je pense aussi que ce problème vient d'ailleurs, que quelque chose dans mysql ne fonctionne pas bien sur cette table, mais je ne suis pas assez connaisseur pour pouvoir détecter quoi. C'est assez hallucinant comme problème : par exemple hier en redémarrant "à la main" le serveur Mysql avec un log des slow_querie > 20 secondes, le problème ne se posait plus du tout ! J'ai alors retesté en démarrant le serveur en utilisant le init.d, le problème se posait de nouveau...je me suis dit que le démarrage init.d causait quelque part ce soucis... En revenant sur un redémarrage à la main, le problème s'est de nouveau posé. Fausse piste donc, ce problème se pose de manière totalement aléatoire. Je ne suis pas assez connaisseur en mysql pour savoir par exemple comment il attribue des priorités de requêtes (s'il le fait), vu que j'ai plusieurs bases est ce que certaines sont prioritaires ? Est ce qu'un verrou par exemple lors d'une requête ne s'enlève pas bien et cause ce soucis sur les requêtes suivantes ? Autre chose très troublante : impossible de vider la table "intervenant" une fois qu'un requête "corrompue" est passée...le TRUNCATE tourne sans cesse sans effacer aucune ligne...quand bien même j'ai enlevé la clé étrangère de la table "journée" qui pointe l'ID intervenant ! (évitant ainsi tout problème d'effacement en cascade, il n'y a pas d'autre table qui pointe ce champ la). Le problème se situerait bien donc du coté de cette table comme tu le pressens avec le problème de l'ID, mais quoi...telle est la question ! |
|
|
|
00
|
|
|
#15 | ||
![]() ![]() |
Quand je disais que je pensais que le problème venait d'ailleurs, je sous-entendais hors de MySQL.
Y a t-il plusieurs programmes qui utilisent la BDD ? Les autres BDD sur le même serveur ? Quand la requête est lente, y a t-il d'autres processus qui tournent sur le serveur MySQL ? Je vois aussi ceci dans ton premier message : Citation:
Citation:
As-tu essayé en local sur ta propre machine en n'exécutant que ça ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#16 | ||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Citation:
Citation:
C'est vrai que la virtualisation peut ne pas arranger les choses... La base sur le DEV a été créée depuis un dump de la base PROD. Bonne idée d'essayer en local, je vais tester ça. Merci pour ton aide ! |
||
|
|
00
|
|
|
#17 | |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
Regarde peut être Commandes d'entretien des tables, au cas où ça révèle un problème. Attention la plus part (voir toutes) de ces commandes vont locker la table. Puisque tu sembles reproduire le problème sur la dev en VM essaie d'abord sur cet environnement. |
|
|
|
00
|
|
|
#18 | |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Citation:
C'est lorsqu'une de ces fameuses requêtes met du temps à s'executer que les suivantes font de même, comme si une requête avait pourri la table. Merci pour les commandes d'entretien, j'ai déjà testé le repair, selon lequel la table est OK. Je vais tester les autres. |
|
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Bon j'ai un peu avancé : les longueurs sont dues au nombre de lignes dans la table Intervenants.
304 : 80 secs 244 intervs : 60 sec 184 intervs : 51 secs 124 intervs : 33 secs 64 intervs : 18 secs 4 intervs : 0 secs Alors que vu la structure de la requête, le nombre d'intervenants ne devrait pas interférer autant dans le temps.. La aussi cela confirmerait qu'il y a un truc pas net avec les ID intervenants. C'est assez parlant...de plus, en executant la requête en ne liant pas la table intervenants, celle-ci s'exécute dans un temps normal. |
|
|
00
|
|
|
#20 | ||||||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 20 ![]() |
Alors quelque chose qui m'interpelle dans le EXPLAIN, c'est l'ordre dans lequel il lit les tables, j'aurai vu l'inverse :
Citation:
Cela me semble étrange qu'il lise en premier la table intervenant, puisque cette table n'est la que pour récupérer des noms-prenoms, elle n'est jamais triée (juste liée à une autre table dont les résultats dépendent de tris). En outre, Citation:
Encore autre chose de bizzare : Un explain avec l'ID intervenant en clé primaire : Code :
Code :
Enfin, même en mettant un USE INDEX (PRIMARY) dans la req sur la table Intervenant, le EXPLAIN reste le même. |
||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com