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 :
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'
Ce qui ne marche pas (sauf quand il n'y a qu'une seule catégorie).

J'ai ensuite fait la requête suivante :
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')
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...

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?