Bonjour,
Je fais appel à votre aide car j'ai un problème de temps d'exécution sur une requete impliquant une jointure sur une clé primaire.
Je travaille sur une base MySQL.
Voici ma base :
3 tables :
entreprise (id_entr, nom, adresse... )
motcle (id_mot, valeur)
entr_mot (num_entr, num_mot)
Il s'agit tout simplement de lier des entreprises avec des mots clés pour faire un petit moteur de recherche. Mon jeu de test comporte 100 000 entreprises, 50 000 mots clés et 1 700 000 tuples dans la table "entr_mot" liant les entreprises et les mots clés.
A cette structure très simple viennent s'ajouter quelques index :
table "entreprise" :
- une clé primaire sur id_entr
table "motcle" :
- une clé primaire sur id_mot
- un index fulltext sur valeur (utilisé pour les recherche de type MATCH... AGAINST...)
table "entr_mot" :
- un index sur num_entr
- un index sur num_mot
Voici la requête que je réalise sur cette base :
SELECT num_entr
FROM motscle
INNER JOIN entr_mots ON (id_motcle=num_motcle)
INNER JOIN entreprise ON (id_entr=num_entr)
WHERE MATCH(valeur) AGAINST('+voiture' IN BOOLEAN MODE)
OR MATCH(valeur) AGAINST('+rouge' IN BOOLEAN MODE)
GROUP BY num_entr
HAVING COUNT( num_entr ) = 2
LIMIT 0 , 30
C'est à dire que je recherche toutes les entreprises qui sont liées à la fois au mot voiture et au mot rouge.
Mon problème :
- Cette requête est excessivement lente avec la clé primaire id_mot (20 à 30 secondes).
- Si je supprime cette clé primaire ou que je la remplace par un index classique, alors la requête est quasiment instantanée (moins de 0.5 secondes).
- Si je ne réalise le test que sur un seul mot clé (donc en supprimant la ligne avec le OR) alors la requête est également instantanée même avec la clé primaire !
N'hésitez pas à me faire partager vos connaissances. Merci pour votre aide.
Message édité par syl20_44 le 26-07-2007 à 17:23:10