Bonjour à tous,
Dans le cadre d'un projet de moteur de recherche j'ai le schéma suivant de BDD
Une table keyword avec 2 champs :
keyword_id : identifiant du mot
keyword_word : mot en lui même
Par exemple
1 afin
2 amenage
3 amigo
4 antigel
5 apareil
6 argentine
7 articl
8 asta
9 avec
10 aventur
11 avez
Ensuite une table page avec 2 champs
page_id : identifiant de la page
page_titre : titre de la page
Et enfin une table link qui permet de relier les mots clefs aux pages :
link_page_id : id de la page dans la table page
link_keyword_id : id du mot clef dans la table keyword
link_poids : coefficient d'importance du keyword pour la page
Cela me permet grâce à la requête suivante de lister dans l'ordre les pages en fonction des mots demandés :
Jusque là ça marche, la requête utilise bien les index et ne parcours pas trop de lignes. Seulement le problème c'est que le nombre de pages grandissant (50 000 et des bananes), la table link grossit aussi mais beaucoup plus rapidement (7 448 696 entrées) ce qui rend la requête de lecture un peu plus lente (avant mise en cache).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT page_id, page_titre, (SUM(link_poids)) AS poids FROM keyword LEFT JOIN link ON link_keyword_id = keyword_id LEFT JOIN page ON page_id = link_page_id WHERE keyword_word IN ('est','pas') GROUP BY link_page_id HAVING COUNT(*) >= 2 ORDER BY poids DESC
J'ai donc voulu partitionner horizontalement la table link pour réduire le nombre de lignes à parcourir. Utilisant MySQL 5.1 j'ai donc accès au partitionnement décris dans ce cours : http://krierjon.developpez.com/mysql/partitionnement/. l'ennui c'est que les infos de la table que je veux partitionner (link) ne me donne pas la possibilité de la partitionner comme je veux : je voulais une partition pour chaque première lettre de chaque mot (donc 26 partitions).
J'ai donc essayé de faire un partitionnement manuel en créant moi même des tables de partitionnement et en gérant moi même les enregistrement dans la bonne table :
J'ai donc créé 26 tables nommées linka pour le mots commençant par a, linkb pour les mots commençant par b, ..., linkz pour les mots commençant par z avec la même structure que la table link
Tout marche au poil sauf une chose et c'est pour ça que je demande de l'aide ou des conseils : Dans ma nouvelle requête de recherche utilisant ces "tables partitions" je n'arrive pas à l'écrire correctement pour joindre les tables
linke et linkp (dans mon exemple) pour ensuite faire les jointures avec les autres tables. J'ai essaye avec UNION mais ça n'a pas l'air d'être la solution (ou alors je l'ai mal utilisé).
Si vous avez une idée ou même une solution je suis preneur, ou même un conseil sur une autre façon de procéder je vous en remercie.
Partager