Bonjour,
ça fait maintenant un bon bout de temps que j'essaie d'optimiser une requête mais je dois avouer que je bloque.
Ma base est composée (en simplifiant) de 2 tables pour un poids d'environ 1GO (indexes soulignés):
Item(IDItem, Name);
ItemCategory(IDItem, IDCategory);
Chaque "Item" peut avoir plusieurs "Category".
Je cherche à retrouver les Items appartenant à un ensemble de catégories. Ma démarche consiste donc à trouver dans un premier temps, les IDItem dans ItemCategory :
J'ai essayé par exemple :
Ce qui ne marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT * FROM ItemCategory GROUP BY IDItem HAVING IDCategory='Category1' AND IDCategory='Category2'(sauf quand il n'y a qu'une seule catégorie).
J'ai ensuite fait la requête suivante :
Malheureusement, le temps d'exécution de la requête est énorme et je trouve que c'est bête de ne pas utiliser les ensembles d'IDItem calculés pour chaque catégorie...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT t.IDItem FROM ItemCategory t WHERE t.IDItem IN (SELECT t0.IDItem FROM ItemCategory t0 WHERE t0.IDCategory='Category1') AND t.IDItem IN (SELECT t1.IDItem FROM ItemCategory t1 WHERE t1.IDCategory='Category2')
Et dans un second temps, je récupère les Items de la façon suivante :
SELECT *
FROM Item i
WHERE i.IDItem IN SOUS-REQUETE
Avec SOUS-REQUETE la requête définie précédemment.
Le problème est que, même avec une seule catégorie, la réponse n'arrive qu'au bout de 30 secondes, ce qui est énorme pour une page web...
J'utilise SQLite parce que mon hébergeur n'accepte que des bases MySQL de taille inférieure à 100mo (et j'en ai 30...). J'ai fait des tests en local avec MySQL et pour la même requête, ça met 150s.
Quelqu'un aurait des conseils pour optimiser mes requêtes?![]()
Partager