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 :

slow query, jointure,concat


Sujet :

Requêtes MySQL

  1. #1
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut slow query, jointure,concat
    Hello tlm !

    J'ai un problème avec 2 requêtes similaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT tt.term_taxonomy_id
    FROM wp_term_taxonomy tt
    LEFT JOIN wp_options o
    ON o.option_name LIKE CONCAT('cma_categories_access_roles_', tt.term_id, '\_%')
    WHERE tt.taxonomy = 'cma_category'
    AND (o.option_id IS NULL )
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tt.term_taxonomy_id
    FROM wp_term_taxonomy tt
    LEFT JOIN wp_options o
    ON o.option_name LIKE CONCAT('cma_categories_experts_', tt.term_id, '\_%')
    WHERE tt.taxonomy = 'cma_category'
    AND (o.option_id IS NULL
    OR o.option_name = CONCAT('cma_categories_experts_', tt.term_id, '_0'))
    Celles-ci prennent environ 1mn à me retourner un peu plus de 8000 résultats. J'aimerais donc trouver une soluce pour les réécrire mais je sèche un peu...
    J'ai fait l'essai suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select tt.term_taxonomy_id 
    from wp_term_taxonomy tt 
    where tt.taxonomy = 'cma_category' 
    and tt.term_id not in (
    select substring(option_name,28,locate('_',substring(option_name,28))-1) 
    from wp_options 
    where option_name like 'cma_categories_access_roles_%');
    J'ai encore 42 secondes d'attente, et je ne suis pas convaincu qu'elle me donnera le même résultat que ma requête d'origine (mode pas confiance dans mon code XD ).

    Une suggestion ?
    Merci d'avance !

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Mr6.

    Sans descriptif des tables et sans jeu d'essai, il est assez difficile de rendre une requête performante.

    Votre problème est l'exemple même d'une mauvaise modélisation de votre base de données.
    Une base de données, ce n'est pas que l'organisation fonctionnelle de vos données, mais aussi une représentation physique pour répondre à des problèmes de performances.

    Il est vivement déconseillé de mettre une chaîne de caractères de longueur variables, en tant que clef primaire (term_id) dans votre table "wp_term_taxonomy".
    Je vous conseille de lire ceci : http://sqlpro.developpez.com/cours/clefs/

    Vous avez deux tables, dont l'une se comporte comme la table "mère" (wp_term_taxonomy) et l'autre comme la table "fille" (wp_options).
    En utilisant une clef artificielle de type numérique, vous auriez une meilleure performance.
    De plus, vous auriez pu utiliser une clef étrangère comme lien entre ces deux tables.
    Vous auriez du même coup, résolu aussi un problème d'intégrité de vos données.

    Pourquoi ne pas créer des catégories et des sous-catégories en décomposant votre colonne "option_name" de votre table "wp_options".
    Autrement dit, pour rendre vos requêtes plus performantes, vous préparez vos tables pour répondre à vos besoins.

    Votre problème, ce n'est pas tant vos deux requêtes, qui par ailleurs sont très similaires, mais l'organisation de vos données.

    Et je suppose aussi, que vous n'avez pas d'index sur vos tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       SELECT  tt.term_taxonomy_id
         FROM  wp_term_taxonomy as tt
    LEFT JOIN  wp_options       as o
           ON   o.option_name LIKE CONCAT('cma_categories_access_roles_', tt.term_id, '\_%')
        WHERE  tt.taxonomy = 'cma_category'
          AND   o.option_id IS NULL
    Un index sur la table "wp_term_taxonomy" : (term_id ; taxonomy(12) ; term_taxonomy_id ; ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT     tt.term_taxonomy_id
         FROM  wp_term_taxonomy as tt
    LEFT JOIN  wp_options       as o
           ON   o.option_name LIKE CONCAT('cma_categories_experts_', tt.term_id, '\_%')
        WHERE  tt.taxonomy = 'cma_category'
          AND  (o.option_id IS NULL
           OR   o.option_name = CONCAT('cma_categories_experts_', tt.term_id, '_0'))
    Même remarque que précédemment.

    Un index sur la table "wp_options" : (option_name).

    Le "in" n'est pas une solution que je proposerais. De plus, il vous manque "distinct" sur le select afin d'éviter d'avoir des doublons.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    term_id est une clé étrangère dans wp_term_taxonomy, mais qui relie à wp_terms, pas à wp_options tel quel.
    Mais cette réponse me conforte dans l'idée que j'avais entrevu, à savoir sortir ces données de wp_options pour gérer les liens dans une autre table qui sera plus adaptée.
    Merci pour les billes, j'ai plus qu'à jouer avec et modifier le code qui va derrière !

Discussions similaires

  1. Palier les «Slow queries» ?
    Par juJuv51 dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/02/2007, 12h50
  2. [MS Query] neophyte demande aide sur jointures SQL
    Par thorgal972 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 27/11/2006, 17h13
  3. Plantage et slow-query.log
    Par bigsister dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/08/2006, 17h03
  4. Réponses: 10
    Dernier message: 27/03/2006, 14h40
  5. Jointure Externe sur base ACCESS par Query Excel
    Par marie10 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2006, 11h20

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