Petit nouveau ! |
7 Messages
18 avr. 2013, 11:05
Bonjour,
Je n'ai pas mis la raison car je ne souhaitais pas qu'elle "pollue" ma question. En fait, j'ai de multiples raisons d'avoir ce type de besoin.
Le premier est le travail que je fais actuellement sur un moteur de recherche qui indexe des centaines de milliers de mots et les enregistre dans une base de données (actuellement MySQL). Pour accélérer la recherche, j'hasche les mots en nombre entier avant de les insérer en base de données. Lors d'une requête, je fais la même opération, ce qui amène le SGBDD à rechercher un entier plutôt qu'une chaîne, d'où un gain de performance car il peut davantage optimiser un index sur une colonne de type INT que sur une colonne de type var_char.
Ensuite, et toujours dans le cadre de ce moteur, j'ai besoin d'effectuer une jointure pour rechercher des mots en fonctions de clés. Mais au lieu d'enregistrer un key_id pointant vers une table keys avec les champs ID, et name, je peux traiter cette correspondance directement dans ma classe PHP en hashant la clé en nombre entier. Bref, sans schéma, j'imagine que ce que je raconte là est incompréhensible, mais l'idée est au final de n'avoir qu'une seule jointure à chaque requête et de ne gérer que des nombres. Sur des milliers de requêtes et des centaines de milliers de mots, ces optimisations ne sont pas négligeables.
Actuellement, j'effectue mon hashage à la main, car vu le nombre de lectures du présent post et du nombre de réponses, j'ai été conforté dans l'idée qu'il ne doit pas exister de façon native d'y arriver. Je me suis donc créé une table de hashage (un simple tableau PHP) avec les caractères ASCII (plus rapide qu'un appel à la fonction ord() sur chaque lettre dans mes tests). Comme je n'enregistre que des mots sans accents et en minuscules, et que j'ai décidé finalement de supprimer les caractères spéciaux, il m'a été facile de créer un tableau avec les correspondances de chaque lettre ou chiffre avec un numéro.
Voili voilou. Après, là où je fais peut-être fausse route, c'est que peut-être un md5 peut-il être, dans MySQL, autant optimisé qu'un nombre entier ? Là j'avoue ne pas savoir, n'étant pas un grand spécialiste des bases de données. Après, le md5 peut déboucher sur des conflits, et dans le cadre d'un moteur de recherche, cela peut entraîner des résultats non pertinents. Alors qu'avec mon petit tableau de haschage, ce risque est inexistant.