IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Problème table temporaire


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 97
    Points
    97
    Par défaut Problème table temporaire
    Bonjour,

    J'ai actuellement un serveur mysql 5.0.44 qui me pose problème quand j'exécute une requête qui contient des requete imbriquées il met environs 20 seconde pour l'effectuer et dans les process mysql il est à "copying to tmp table"

    j'ai lu ceci : "Malheureusement, un bug dans MySQL, introduit dans la version 5.0.44 fait que lors des opérations de filesorting, les tables temporaires ne sont pas créés dans le tmpdir mais dans le repertoire de la base de donnée."

    Quelqu'un connait-il une soluce pour ce problème ? mise à jour mysql ? correctif ?


    Merci d'avance

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 495
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 495
    Points : 6 067
    Points
    6 067
    Par défaut
    Au dire de ce que tu dis je vois pas le rapport entre le temps d'execution et l'emplacement du fichier de la table temporaire. A moins que ça soit pas sur le même disque ou situation géographique. Le temps d'exécution peut être lié à beaucoup de chose.
    Avant d'accuser Mysql regarde de ton coté .
    Pose la requête éventuellement ici pour que nous puissions y jeter un oeil

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 97
    Points
    97
    Par défaut
    Je pense que le problème ne vient pas de la requête car avant elle marchée très bien sur mon ancien serveur, j'étais sur mysql 5.0.21 et depuis que je suis passé sur la 5.0.44 sur ce nouveau serveur elle est très longue.

    de plus cette même requête avec la même base marche impec en local (easyphp 1.8)

  4. #4
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 495
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 495
    Points : 6 067
    Points
    6 067
    Par défaut
    Bon là, effectivement il y a pas un problème sur la gestion des tables temporaires. Je pourrais te donner une astuce qui consiste à utiliser une table fixe mais avec le moteur "Memory". Je pense que ça ira beaucoup plus vite. Tu fais un drop derrière.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 97
    Points
    97
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
     
    		SELECT 
    		carbeo_station.id 			AS idStation,
    		carbeo_station.nom 			AS nomStation,
    		carbeo_station.enseigne 	AS enseigneStation,
    		carbeo_station.adr1			AS adr1Station,
    		carbeo_station.adr2			AS adr2Station,
    		carbeo_station.coord_multimap,
    		carbeo_station.ville		AS villeStation,
    		CASE WHEN carbeo_station.coord_multimap = 1 THEN 0 ELSE carbeo_station.latitude END as stationLat,
    		CASE WHEN carbeo_station.coord_multimap = 1 THEN 0 ELSE carbeo_station.longitude END as stationLong,
    		carbeo_station.cat			AS catStation,
     
    		carbeo_station.dernier_prix	AS lastPrice,
     
    		cp.user AS lastTimePoster,
     
    		carbeo_enseigne.id			AS idEnseigne,
    		carbeo_enseigne.nom 		AS nomEnseigne,
    		carbeo_enseigne.path		AS pathEnseigne,
    		carbeo_enseigne.path_bg		AS pathFondEnseigne,
    		carbeo_enseigne.aff_logo	AS affEnseigne,
     
    		carbeo_ville.id				AS idVille,
    		cv.nom			AS nomVille,
    		carbeo_ville.arrond			AS arrondVille,
    		cv.cp				AS cpVille,
    		carbeo_ville.latitude		AS villeLat,
    		carbeo_ville.longitude		AS villeLong,
     
    			SQRT(POWER(111.317076533 * ABS(carbeo_ville.latitude - carbeo_station.latitude), 2) + POWER(111.317076533 * ABS(carbeo_ville.longitude - carbeo_station.longitude), 2)) AS dist, timeSP98, timeSP95, timeGas, timeGO, timeGPL, pxGas, pxSP95, pxSP98, pxGO, pxGPL, pxE85, CASE WHEN carbeo_station.dernier_prix = -1 THEN -1 ELSE cp.creation_time END as lastTime
    			, posterSP95, posterSP98, posterGas, posterGO, posterGPL, posterE85
    		, idSP98, idSP95, idGas, idGO, idGPL, idE85
    		 FROM 
    			carbeo_ville,
    			carbeo_ville v2,
    			carbeo_ville cv,
    			carbeo_prix cp,
    			carbeo_enseigne,
    			carbeo_station,
    			carbeo_station ss 
    			left join (select creation_time as timeGas, prix as pxGas, station, user AS posterGas, id AS idGas From carbeo_prix Where carburant = '1' AND aff = 1) px1 on (px1.station = ss.id) 
    			left join (select creation_time as timeSP95, prix as pxSP95, station, user AS posterSP95, id AS idSP95 From carbeo_prix Where carburant = '2' AND aff = 1) px2 on (px2.station = ss.id) 
    			left join (select creation_time as timeSP98, prix as pxSP98, station, user AS posterSP98, id as idSP98 From carbeo_prix Where carburant = '3' AND aff = 1) px3 on (px3.station = ss.id) 
    			left join (select creation_time as timeGO, prix as pxGO, station, user AS posterGO, id as idGO From carbeo_prix Where carburant = '4' AND aff = 1) px4 on (px4.station = ss.id) 
    			left join (select creation_time as timeGPL, prix as pxGPL, station, user AS posterGPL, id as idGPL From carbeo_prix Where carburant = '5' AND aff = 1) px5 on (px5.station = ss.id)
    			left join (select creation_time as timeE85, prix as pxE85, station, user AS posterE85, id as idE85 from carbeo_prix where carburant = '7' AND aff = 1) px7 on (px7.station = ss.id)
     
    		WHERE 
    			carbeo_ville.id = '22222' 
    			AND 
    			SQRT(POWER(111.317076533 * ABS(carbeo_ville.latitude - carbeo_station.latitude), 2) + POWER(111.317076533 * ABS(carbeo_ville.longitude - carbeo_station.longitude), 2)) < 10
    			AND
    			v2.id = carbeo_station.ville
    			AND 
    			carbeo_enseigne.id = carbeo_station.enseigne
    			AND
    			carbeo_station.id = ss.id
    			AND
    			carbeo_station.dernier_prix = cp.id
    			AND
    			cv.id = carbeo_station.ville
    			 AND carbeo_station.only_fioul = 0 ORDER BY lastTime DESC LIMIT 0, 10
    Voici la requête si cela peut aider....

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 495
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 495
    Points : 6 067
    Points
    6 067
    Par défaut
    Sacré requête.
    de ce que je vois, il y a pas mal d'ingrédients qui ne favorise pas la vitesse mais bon si les informations doivent être pris ainsi. Le faite de placer une fonction au niveau du SELECT et dans la clause WHERE c'est qu'elle va se répéter autant de fois qu'il y a de ligne. Donc si dans ces fonctions il y a une requête ça pourrait favoriser le ralentissement et voir certain blocage de table.
    Le faite aussi qu'il y ait des jointures du type LEFT n'améliore pas les performances. Bref, néanmoins cela n'explique pas pourquoi d'une version à l'autre de Mysql le temps d'exécution est aussi longue.
    Je suppose que la fonction SQRT et POWER sont des fonctions utilisateurs.

    En faite, je crois qu'il y a une copie lorsque le jeux de résultat est trop important. Il faut tenter de faire un EXPLAIN devant ta requête il va te donner des informations pour d'éventuelle optimisations.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 129
    Points : 97
    Points
    97
    Par défaut
    DQRT et POWER sont des fonctions mysql permettant d'avoir la racine carré et la puissance d'un nombre.

    Pour ce qui est du explain j'ai déjà essayer, les index sont correct et tout après je ne sais pas vraiment ou optimiser...

    Voici un résumé du explain



    Dans la première ligne on voit "Using filesort", c'est pour cela en voyant ceci "Malheureusement, un bug dans MySQL, introduit dans la version 5.0.44 fait que lors des opérations de filesorting, les tables temporaires ne sont pas créés dans le tmpdir mais dans le repertoire de la base de donnée." je me suis dit l'erreur est peut-être la... mais est-ce que ce bug est corrigé dans une new version ou un correctif ?

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 495
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 495
    Points : 6 067
    Points
    6 067
    Par défaut
    Je vois pas en quoi ce bug puisse être à l'origine de temps de latence généré à moins que le répertoire data se trouve sur un disque rapide et mysql sur une disque dure très très lent. Disque dure 128Mo PIO2.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/01/2008, 21h22
  2. [MySQL] Problème avec table temporaire
    Par zoom61 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 22/10/2007, 13h43
  3. Réponses: 8
    Dernier message: 06/06/2007, 17h03
  4. Problème : table temporaire
    Par midotoon dans le forum Administration
    Réponses: 10
    Dernier message: 10/05/2007, 00h01
  5. table temporaire problème
    Par lazzeroni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/09/2006, 23h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo