Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MYSQL] Optimisations ...

Quelle galère !

Sujet résolu
    20 février 2012 à 1:10:35

    Bonsoir à tous.
    J'ai un bdd de 3M d'entrée. Elle possède 4 tables :

    - videos (contenant des id de thumbs)
    - link_tags (contenant des id de videos et de tag)
    - tags (contenant des tags)
    - thumbs (contenant des id videos et adresse de thumbs)

    Je crois que ça doit déjà vous dire quelques chose. Je souhaite faire une recherche de vidéos selon des tags donnés dans ma requête SQL. Voici la requête que j'exécute :
    SELECT v.*
    FROM videos v 
    INNER JOIN (
                SELECT lt.ID_VIDEO
                FROM link_tags lt 
                   INNER JOIN videos v ON v.id = lt.ID_VIDEO
                   INNER JOIN tags t ON t.ID = lt.ID_TAG 
                WHERE t.tag IN ('TAGS', 'TAGS')
    ) 
    GROUP BY lt.ID_VIDEO HAVING Count(lt.ID_VIDEO) = *nbrTags*) vv ON v.ID = vv.ID_VIDEO
    


    Elle me semble correcte mais lourde tout de même, ça se vérifie, une requête prend 5 secondes sur un serveur dédié Linux 64bits 4Core 2.67Ghz et 16go de ram. Le query_cache_size est à 128M.
    Le problème c'est que mes capacités en mysql ne me permettent pas une optimisation plus efficace ... Vous auriez des idées ? Peut être une nouvelle organisation de la bdd ? Si oui, comment faire autrement ?

    Je vous remercies par avance ! :)
    • Partager sur Facebook
    • Partager sur Twitter
      20 février 2012 à 7:50:18

      Pas beosin de la sous-requ^te il me semble. Fait directement ton GROUP BY sur la requête interne, ça suffit.

      Tu as des index, des clés primaires, des clés étrangères dans tes tables ?
      • Partager sur Facebook
      • Partager sur Twitter
        20 février 2012 à 11:42:53

        Ce n'est pas possible d'optimiser ce type de requête avec une base SQL standard. Donc tu peux utiliser :

        - un moteur Fulltext performant
        - une BDD qui supporte un type d'index adapté (ex: postgresql+gist)
        - un moteur de tag cloud (si tu en trouves)

        Le problème des tags est très similaire au problème de la recherche fulltext. Si tu veux rester avec MySQL, je te conseille un moteur Fulltext performant comme Sphinx, Xapian ou Lucene, qui devraient être capable de traiter une recherche comme celle-ci en quelques ms. Il me semble que stackoverflow utilise lucene pour ses tags. Note que le mot "performant" exclut d'office le moteur Fulltext de MySQL (outre le fait qu'il oblige à utiliser MyISAM...)
        • Partager sur Facebook
        • Partager sur Twitter
          21 février 2012 à 15:44:01

          Donc il serait préférable que je passe à du PostGreSql ou que je démonte gentiment le moteur mysql pour y mettre un moteur 16 soupapes de 640ch.
          Ca me va :) J'ai toujours eu l'habitude du mysql, mais je sens qu'il va falloir que je change x)

          Merci pour vos réponses.
          • Partager sur Facebook
          • Partager sur Twitter
            21 février 2012 à 15:46:22

            C'est pas forcément la peine de changer de BDD, mais au moins pour les tags, essaie d'abord sphinx.
            • Partager sur Facebook
            • Partager sur Twitter

            [MYSQL] Optimisations ...

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown