Qui de requête SQL est le meilleur, le MATCH CONTRE ou COMME?
À la recherche de la base de données pour les lignes qui ont les deux mots clés "foo" ET "bar" dans les colonnes "foo_desc" et "bar_desc", je voudrais faire quelque chose comme:
SELECT *
FROM t1
WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST ('+foo* +bar*' IN BOOLEAN MODE)
ou
SELECT *
FROM t1
WHERE (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%foo%') AND (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%bar%')
J'attends la baisse de la dernière requête est la performance.
L'avantage est que la requête ne trouve 'xxfoo" où le MATCH CONTRE le ne pas.
Qui est privilégiée ou est-il une meilleure solution?
Vous devez vous connecter pour publier un commentaire.
Mise à jour
De
MySQL 5.6
et, plus tard,InnoDB
tables soutientMatch... Against
.La première est beaucoup mieux. Sur MyISAM tableaux, il va utiliser un index de texte intégral à l'encontre de ces colonnes. L'autre va faire un full table scan de faire un concat sur chaque ligne, puis une comparaison.
LIKE
est efficace seulement si vous le faites contre:LIKE 'blah%'
par opposition àLIKE '%blah%'
); etSi un quelconque de ces conditions ne sont pas remplies pour que le moteur SQL pour exécuter la requête est de faire un full table scan. Cela peut être utilisable sous environ 10 à 20 mille lignes. Au-delà de que cela devient vite inutilisable cependant.
Remarque: Un problème avec le MATCH sur MySQL est qu'il semble ne correspondre à l'encontre de mots entiers donc une recherche pour 'bla' ne correspond pas à une colonne avec une valeur de "bla", mais une recherche de " bla*' volonté.