Auteur Sujet: [mysql] Full-text Contre Like%...%  (Lu 1027 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Dimitri01

  • Connaisseur
  • ***
  • Messages: 366
[mysql] Full-text Contre Like%...%
« le: 09 février 2004 à 21:53:19 »
Bonjour,

Je viens de procéder à fifférents essais de requêtes sql, dans le but d'interroger une table.

Cette table contient les champs suivants :

id | nom | sigle | adresse | permanence | activites | infos

Les champs activites et infos sont des champs de type text.

Cette table est de taille modeste (263Ko), avec 681 enregistrements.

En exécutant la requête suivante :

SELECT *
FROM `associations`
WHERE (
nom
LIKE '%asso%' OR sigle
LIKE '%asso%' OR adresse
LIKE '%asso%' OR activites
LIKE '%asso%' OR info
LIKE '%asso%'
) OR (
nom
LIKE '%musique%' OR sigle
LIKE '%musique%' OR adresse
LIKE '%musique%' OR activites
LIKE '%musique%' OR infos
LIKE '%musique%'
) OR (
nom
LIKE '%spectacle%' OR sigle
LIKE '%spectacle%' OR adresse
LIKE '%spectacle%' OR activites
LIKE '%spectacle%' OR infos
LIKE '%spectacle%'
) LIMIT 100 , 30  

J'obtiens (sur une vingtaine de requêtes) une moyenne de 0,0572 sec en temps d'exécution.

Une requête similaire en full-text (donc avec les champs sigle, adresse, activite et infos comme index full-text.)

SELECT * ,   MATCH (nom, sigle, adresse, activites, info)
AGAINST ('asso* musique* spectacle* IN BOOLEAN MODE')
FROM associations
WHERE MATCH (nom, sigle, adresse, activites, info)
AGAINST ('asso* musique* spectacle* IN BOOLEAN MODE')
LIMIT 100, 30

(rem : en mode booléen ou non, les temps d'exécution sont similaires dans mes essais.)

 :ph34r: Je sais que les deux recherches ci-dessus ne sont pas identiques dans leur fonctionnement, et leurs résultats seront donc différents)

J'obtiens en moyenne un temps d'exécution de 0,1862 sec.

Je sais que c'est dur de comparer 2 requêtes qui donnent un résultat différent, mais c'était juste pour avoir une idée.

J'en tire une conclusion, mais je voulais savoir si elle vous semble correcte (vue que mon test n'est pas très fiable).

Je me dis qu'implémenter une recherche en full-text n'est pas indispensable sur de petites tables (surtout avec une instruction LIMIT). Au contraire, il est finallement plus rapide de la parser entièrement avec le LIKE%..%. Sans parler que le mode full-text génère des index qui augmente considérablement la taille de la base.

Qu'en pensez-vous ? Dans mon application, je n'ai pas besoin de proposer une recherche booléenne, pas plus qu'un classement de pertinence (de toute façon complétement faux dans MySQL lorsque les données interrogées ne sont pas assez importantes). De plus, ma table n'augmentera pas en taille, ou très peu. Elle ne dépassera jamais les 700 enregistrements. Par contre, elle sera continuellement mise à jour (donc trop d'index, surtout inutiles, sont préjudiciables dans ce cas.)

L'utilisation du LIKE%..% (qui n'exploite donc aucun index), est tout de même plus rapide que la recherche en texte entier, aurais-je tord de l'utiliser ?

Dans ce cas, je gère moi même la liste noire (mots de moins de 3 lettres interdits...)

Je pense que la recherche full-text ne se justifie pas dans mon cas (table de moins de 300Ko, moins de 700 lignes, aucun risque d'augmentation importante).

Est un péché que de parser une table entière, sans utilisation d'index, lorsqu'elle est toute petite ?  :blink:

Comment faire autrement ? Conserver la recherche full-text, même si celle-ci est plus lente ?  :(

Merci de bien vouloir me donner vos avis de spécialistes !

D.

Hors ligne Pat31

  • Débutant
  • *
  • Messages: 28
[mysql] Full-text Contre Like%...%
« Réponse #1 le: 10 février 2004 à 23:21:53 »
Citer
id | nom | sigle | adresse | permanence | activites | infos
Les champs activites et infos sont des champs de type text.
Cette table est de taille modeste (263Ko), avec 681 enregistrements.
Quel cluster tu utilises ?
Citer
J'obtiens (sur une vingtaine de requêtes) une moyenne de 0,0572 sec en temps d'exécution.
[...]
J'obtiens en moyenne un temps d'exécution de 0,1862 sec.
J'ai moi même effectué quelques essais sur une petite base de 360 enregistrements de 100 Ko environ en utilisant/comparant %Like% et Match...
J'obtient aussi un résultat légèrement inférieur  :(
Citer
Je me dis qu'implémenter une recherche en full-text n'est pas indispensable sur de petites tables (surtout avec une instruction LIMIT). Au contraire, il est finallement plus rapide de la parser entièrement avec le LIKE%..%. Sans parler que le mode full-text génère des index qui augmente considérablement la taille de la base.
Oui, c'est à croire que cette méthode donne des résultats pour des tables volumineuse ?
Citer
Est un péché que de parser une table entière, sans utilisation d'index, lorsqu'elle est toute petite ?
J'ai essayé (pour voir) de créer un index en limitant d'abord à 5 car. chaque colonne. puis, ensuite, à 7 car., et le résultat sur la taille de l'index est presque identique et celui des requetes aussi.

Hors ligne Dimitri01

  • Connaisseur
  • ***
  • Messages: 366
[mysql] Full-text Contre Like%...%
« Réponse #2 le: 11 février 2004 à 10:14:00 »
Salut Pat,

Citer
Quel cluster tu utilises ?
Aucun, mes essais ont été fait en local sur mon PC, avec cependant la même version de MySQL que celle de PHPNET.

J'ai posé la question à un spécialiste des bases de données, qui m'a répondu que la recherche full-text n'est effectivement intéressante que pour les grosses tables (>5Mo), encore que cela dépend de la nature des champs.

D'àprès lui, c'est une ereur que de vouloir l'utiliser sur de petites tables. L'un des intérêts que représente la racherche full-text est la possibilité de classement des résultats selon un degré de pertinence, or sur les petites tables, l'interprétation de la pertinence des résultats est complétement faussée.

Chose que j'ai effectivement pu vérifier. Il faut plusieurs milliers de lignes dans une table pour espérer pouvoir tirer quelquechose d'intéressant dans MySQL.

En fait, toute la question trouve sa réponse dans l'évolution possible d'une table. S'il s'agit d'une table contenant un nombre plus ou moins fixe d'enregistrements, mais continuellement mis à jour, et si cette table fait moins de 5Mo, il est préférable d'utiliser l'instruction LIKE%..% pour effectuer une recherche, même sur des champs de type text. Il ne faut par contre déclarer aucun index (concernant cette recherche avec LIKE) ce qui rendra plus rapide toute mise à jour (un LIKE%..% n'utilise pas d'index, contrairement au LIKE ...%).

Maintenant, il est important de procéder à quelques améliorations dans ce type de recherche. Eviter de lancer la recherche sur des mots de moins de 3 lettres, créer sa propore liste noire, et dans le cas d'un moteur de recherche avec saisie libre de mots clés, ne tenir compte que d'un nombre limité de mots (les 5 premiers, par exemple) pour éviter d'avoir une requête gigantesque (ce qui n'est plus le cas avec la commande MATCH).

D.