Optimisation d'une requête


bidulemachin
WRInaute discret
WRInaute discret
 
Messages: 102
Inscription: 5 Oct 2007

Optimisation d'une requête

Message le Mar Fév 26, 2008 9:55

Bonjour à tous,

Voilà mon problème, j'ai mis en place une sorte d'annuaire.

Chaque élément peut se trouver dans un maximum de 10 catégories, category_id1, category_id2, category
_id3... ainsi de suite sont donc des champs dans la table qui regroupe mes éléments.

J'ai aussi une table regroupants toutes les catégories avec une hiérarchie à un niveau mère/fille.

Sur la page d'affichage d'un catégorie, je cherche tous les éléments qui se trouvent dans cette catégorie ou qui ont des filles dans cette catégorie.

Ca donne quelquechose comme :

Code: Tout sélectionner
OR (category_id2 = 49 OR
category_id2 IN (SELECT category_id FROM category WHERE par_category_id = 49))       
              OR (category_id3 = 49 OR
category_id3 IN (SELECT category_id FROM category WHERE par_category_id = 49))

OR (category_id4 = 49 OR
category_id4 IN (SELECT category_id FROM category WHERE par_category_id = 49))


Et ainsi de suite pour categor_id5,6,7,8,9....

Cette requête fonctionne bien mais cette page étant de plus en plus demandée, mon hébergeur a tiré un peu la sonette d'alarme en me demandant d'optimiser ma requête.

C'est là que j'ai besoin de vous, toute idée est la bienvenue...[/code]

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: Optimisation d'une requête

Message le Mar Fév 26, 2008 11:13

bidulemachin a écrit:Chaque élément peut se trouver dans un maximum de 10 catégories, category_id1, category_id2, category
_id3... ainsi de suite sont donc des champs dans la table qui regroupe mes éléments.


Tu devrais avoir une autre table pour faire le lien entre les éléments et les catégories: (id_element,id_category). Ca a l'avantage que tu peux ensuite avoir autant de catégories que tu veux, et surtout ça simplifie pas mal les choses, il suffit de faire une jointure pour savoir si un élément est dans une catégorie: select * from elements e,liens l where l.id_element=e.id and l.id_category = ?

Jacques.


mikaelka
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 30
Inscription: 24 Déc 2007

Message le Mer Fév 27, 2008 16:18

Salut, je n'ai pas trouvé d'équivalent du "connect by" de oracle pour mysql, tu peux aller voir sur un forum qui en parle si sa ressemble à ton cas :

http://www.developpez.net/forums/showthread.php?t=51796&page=1

Si ton problème se pose sur le nombre de demande sur cette requête je pense que le mieux est de changer ta requête.

Tu peut aussi essayer d'améliorer ton modele puisque, dix éléments c'est déjà pas mal. Peut être faire une relation, R(ID_ELEMENT, ID_CAT) avec ID_ELEMENT et ID_CAT en clé primaire(couple)/étrangère.

De toute façon tu peut faire mieux sur la requête sa c'est sûr.

jarreweb
WRInaute discret
WRInaute discret
 
Messages: 192
Inscription: 12 Sep 2003

Message le Mer Fév 27, 2008 16:33

même avis que jcaron
et la requete aura comme condition un IN
exemple
Code: Tout sélectionner
SELECT mon_champ FROM t1,t2 WHERE t1.id=t2.id AND t2.id IN (1,53,12)


en gros, il faut que tu revois ta structure de base de données
lorsque l'on a tout un tas de valeurs qui reviennent, le plus efficace est de faire des tables de données uniques et une table qui les relient


bidulemachin
WRInaute discret
WRInaute discret
 
Messages: 102
Inscription: 5 Oct 2007

Message le Ven Fév 29, 2008 11:23

Merci à tous pour vos réponses, ça marche très bien avec la jointure :D


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité