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 :

[MariaDB 11.3.2] left join avec order by très lent (use filesort)


Sujet :

Requêtes MySQL

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 41
    Points : 13
    Points
    13
    Par défaut
    Oui tout à fait, merci pour ce rappel

  2. #22
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bonsoir,

    J'ai lu un peu vite la discussion mais j'ai l'impression que ce qui plombe les performances, c'est le ORDER BY, non ?

    Avez-vous essayé votre jointure externe sans le ORDER BY mais en laissant le LIMIT 20, pour voir ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 41
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Désolé pour cette réponse tardive.

    Oui c'est bien le ORDER BY qui ralentit le tout

  4. #24
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Réfléchissons donc pourquoi le order by ralentit tout...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select herbs.id, sciname, name 
    from herbs
    left join herb_translations on herbs.id = herb_translations.herb_id and locale = 'fr'
    order by herb_translations.name asc limit 20;
    Du fait de la jointure externe, la colonne name va se retrouver avec des NULL quand il n'y a pas de traductions.
    Et vous demandez d'ordonner la colonne name.
    Or pour un SGBD, NULL <> NULL et je me demande si MySQL n'est pas embêté par le tri de ces NULL.

    Du coup, je propose l'idée suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT herbs.id, sciname, name 
    FROM herbs
    INNER JOIN herb_translations on herbs.id = herb_translations.herb_id AND locale = 'fr'
     
    UNION
     
    SELECT herbs.id, sciname, '' 
    FROM herbs
    LEFT JOIN herb_translations on herbs.id = herb_translations.herb_id AND locale = 'fr'
    WHERE herb_translations.herb_id IS NULL
     
    ORDER BY  name ASC LIMIT 20;
    => Une chaîne vide à la place de NULL, MySQL devrait savoir l'ordonner sans problème.
    Et à la place de la chaîne vide, vous pouvez aussi mettre une chaîne indiquant qu'il n'y a pas de traduction : 'SANS TRADUCTION' par exemple. Vous verrez ainsi facilement en plus quelles traductions il vous manque.

    À tester !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #25
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 41
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    => Une chaîne vide à la place de NULL, MySQL devrait savoir l'ordonner sans problème.
    Bonjour,

    Merci beaucoup pour votre proposition.

    J'ai essayé et cela ne règle malheureusement pas le problème.

    Merci tout de même

  6. #26
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Voici le résulats des Analyze sous MariaDB 10.6, peu convaincant malheureusement

    1 : inner join
    2 : outer join
    3 : inner union outer avec restriction

    Nom : Sans titre.png
Affichages : 31
Taille : 40,0 Ko

    Le DB<>Fiddle ICI

Discussions similaires

  1. Requête avec LEFT JOIN et ORDER BY très lente
    Par defacta dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/10/2016, 01h26
  2. Faire un Left join avec pro*C
    Par xoum89 dans le forum SQL
    Réponses: 4
    Dernier message: 15/05/2009, 07h54
  3. left join avec max(date)
    Par supernicoco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/10/2008, 08h53
  4. Left join avec 3 tables
    Par MathiasMathias dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/04/2007, 00h45
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38

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