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 ?
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...)
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)
C'est pas forcément la peine de changer de BDD, mais au moins pour les tags, essaie d'abord sphinx.
[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.
Tutoriel complet MySQL !