Recherche à améliorer

Petit nouveau ! | 5 Messages

17 mai 2011, 11:30

Bonjour,

j'aimerais réduire le temps d'éxecution d'une requête :

Code : Tout sélectionner

SELECT DISTINCT table1.mot_a_rechercher FROM table1,table2 WHERE table2.phrase LIKE concat( '%', table1.mot_a_rechercher, '%' ) order by table1.mot_a_rechercher
La table1 contient des milliers de mots à rechercher, de même pour la table2 qui contient des milliers de "phrase" dans lequelles on recherche les mots.

Existe-t-il une technique, ou des requêtes plus avancées pour effectuer une recherche beaucoup plus rapide? Est-ce que c'est la fonction concat qui prend trop de temps d'éxécution?

Si quelqu'un à une idée je suis prenneur, merci.

Eléphant du PHP | 275 Messages

17 mai 2011, 11:36

Je suppose qu'une requete fulltext serait meilleure.

Mais l'idéal, c'est encore une table de relation entre ta table1 et ta table2. Quand tu insere ta phrase dans ta table2, tu parse la phrase en php et tu insère les relations entre ta phrase et les mots qui la composent.

Petit nouveau ! | 5 Messages

17 mai 2011, 15:14

Les "mots" que je recherche sont en faite plus des codes et ils se ressemblent beaucoup, les requêtes full text ignorent malheuresement la plupart des occurences.

Mammouth du PHP | 672 Messages

17 mai 2011, 15:46

Qu'est-ce que tu veux faire, au juste (objectif final de la requête) ?

La table des "mots" change souvent ? Si non, la proposition de popy (table de relation) ou un système de ce genre me semble le mieux...

Petit nouveau ! | 5 Messages

17 mai 2011, 16:18

J'ai reformulé avec des mots et phrases, mais concretement,

le champ phrase de la table2 "référence" le champ mot de la table 1 mais je ne peux pas les comparer directement car ils ne correspondent pas exactement, le mot (ou code) est seulement contenu dans la phrase (ou code plus détailler).

exemple de mot : 0024UJG1
exemple de phrase : PTOPU0024UJG1-AYGL-AG

les mots changent mais se ressemblent trop pour le fulltext, ex : 0018GTS7 0018HGE7 0018HGF8

Au final je veux faire ce que fait ma requête initiale : afficher le mot (ou d'autre champs de la table1, le pb n'est pas là) s'il est contenu dans le champ phrase de la table2.

Le problème est que cette requête met beaucoup trop de temps à s'éxecuter, étant débutant, je ne connais que des requêtes simples c'est pourquoi j'ai posté pour demander des avis extérieurs.

Je vais me renseigner sur les table de relation comme vous me le suggérer tous les 2. Merci.

Mammouth du PHP | 672 Messages

17 mai 2011, 16:35

J'ai reformulé avec des mots et phrases, mais concretement,

le champ phrase de la table2 "référence" le champ mot de la table 1 mais je ne peux pas les comparer directement car ils ne correspondent pas exactement, le mot (ou code) est seulement contenu dans la phrase (ou code plus détailler).

exemple de mot : 0024UJG1
exemple de phrase : PTOPU0024UJG1-AYGL-AG

les mots changent mais se ressemblent trop pour le fulltext, ex : 0018GTS7 0018HGE7 0018HGF8

Au final je veux faire ce que fait ma requête initiale : afficher le mot (ou d'autre champs de la table1, le pb n'est pas là) s'il est contenu dans le champ phrase de la table2.
Ca ressemble beaucoup à des références.
=> Revoir les tables si possible, avec les relations qui vont bien (clés etrangères). Et en décomposant cette "phrase".


Sinon, si je t'ai bien suivi, tu veux afficher les "mots" de table1 qu'on retrouve dans table2.
- Rajoute un champ "existeDansTable2" dans table1.
Tu passes la requête une fois pour faire un update de table1 (et mettre "oui" si le mot existe dans table1). Après, à chaque rajout dans table1/table2 tu repasses la requête sur ce mot/cette phrase.
- Passe la requête toutes les nuits (ou sur un autre intervalle suivant la fréquence des mise à jour) et stocke le résultat dans une table.
- Crée une table qui va contenir les relations :
relations (id_mot, id_phrase)