哪个SQL查询更好,MATCH AGAINST还是LIKE?

Wil*_*Wil 66 mysql sql database search

要在数据库中搜索任何列"foo_desc"和"bar_desc"中包含关键字"foo"和"bar"的行,我会执行以下操作:

SELECT * 
FROM t1 
WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST ('+foo* +bar*' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * 
FROM t1 
WHERE (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%foo%') AND (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%bar%')
Run Code Online (Sandbox Code Playgroud)

我预计最后一个查询的缺点是性能.

好处是LIKE查询找到'xxfoo',其中MATCH AGAINST没有.

哪个是首选的还是有更好的解决方案?

cle*_*tus 63

更新

从表格MySQL 5.6到后来,InnoDB表格都支持Match... Against.


第一个好得多.在MyISAM表上,它将对这些列使用全文索引.另一个将进行全表扫描,在每一行上进行连续,然后进行比较.

LIKE 只有你这样做才有效率:

  • 列(不是函数的结果,除非您的特定数据库供应商支持功能索引 - 例如Oracle - 并且您正在使用它们);
  • 专栏的开头(即LIKE 'blah%'相反LIKE '%blah%'); 和
  • 索引的列.

如果这些条件中的任何一个不正确,则SQL引擎执行查询的唯一方法是执行全表扫描.这可以在大约10-20,000行下使用.除此之外,它很快变得无法使用.

注意:关于MySQL的MATCH的一个问题是它似乎只匹配整个单词,所以搜索'bla'将不匹配值为'blah'的列,但搜索'bla*'将会.

  • 评论你的注释:如果你搜索bla*,MATCH将返回值为blah的列 (20认同)
  • @Strae`要索引的单词的最小和最大长度由InnoDB搜索索引的innodb_ft_min_token_size和innodb_ft_max_token_size以及MyISAM搜索索引的ft_min_word_len和ft_max_word_len定义.https://dev.mysql.com/doc/refman/5.7/ EN /全文-细tuning.html (5认同)
  • 是的,最少4个字符 (3认同)