-
Optimisation requetes
Bonjour,
J'ai un souci de perfs sur certaines requêtes. Actuellement je fais comme ça :
1. Table categories
------------------------------------------------
| id | nom_cat | description|
------------------------------------------------
| 18 | maison/jardin/plantes | blablabla |
------------------------------------------------
| 19 | maison/jardin | blablabla |
2. Table liens
-------------------------------------------------------------------------------
| id | url | titre | nom_cat |
-------------------------------------------------------------------------------
| 5 | h*tp://www.domaine.net | blobloblo | maison/jardin/plantes |
Pour cet exemple : pour regrouper tous les enregistrements de la table liens qui font partie de la categorie "maison/jardin" et donc de toutes ses sous catégories (donc "maison/jardin/plantes" inclu), je fais une requête du style :
select * from liens where nom_cat like '%jardin%'
Hors vous en conviendrez, c'est pas ce qui s'appelle de l'optimisation. Les requêtes sont extrêment lourdes et j'aurais aimé un moyen de les alléger.
J'ai pensé mettre un champs "index_id" à la table liens et à la table categorie afin de faire un regroupement sur tous les liens qui ont le même index_id, mais le probleme c'est que dans les resultats dont j'ai besoin il peut y avoir des sites qui sortent pour plusieurs types de catégories, donc je suis un peut coincé. Quelqu'un aurait-il une idée pour rendre les requêtes moins lourdes?
Merci,
Stephane
-
Bonjour,
Ta table n'est pas normalisée.
Mettre dans une seule colonne VARCHAR la catégorie/souscatégorie/sousoucatégorie est une très mauvaise idée, on le voit avec ce problème de performances (un LIKE '%xxx%' n'utilise pas du tout d'index donc ça rame)...
Il vaut mieux partir sur ce genre de modélisation :
Lien(id_lien, url)
Categorie(id_categorie, id_categorie_parente)
Categorie_lien(id_lien, id_categorie)
C'est beaucoup plus propre et en plus ça permet de mettre un lien dans plusieurs catégories. Tu trouveras sur ce forum des solutions pour gérer la hiérarchie (savoir quelle est la catégorie ancêtre d'une catégorie, etc.)