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


67

要在数据库中搜索在任何列“ foo_desc”和“ bar_desc”中同时具有关键字“ foo”和“ bar”的行,我将执行以下操作:

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

要么

SELECT * 
FROM t1 
WHERE (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%foo%') AND (CONCAT(t1.foo_desc, t2.bar_desc) LIKE '%bar%')

我希望最后一个查询的缺点是性能。

好处是,LIKE查询找到了“ MATGA AGAINST”找不到的“ xxfoo”。

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

Answers:


65

更新资料

截至MySQL 5.6及以后,InnoDB表格支持Match... Against


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

LIKE 仅在针对以下情况这样做才有效:

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

如果这些条件中的任何一个都不成立,则SQL引擎执行查询的唯一方法是执行全表扫描。这可以在大约1万到2万行下使用。除此之外,它很快变得不可用。

注意:在MySQL上,MATCH的一个问题是它似乎只能与整个单词匹配,因此对'bla'的搜索将与值为'blah'的列匹配,而对'bla *'的搜索将会匹配。


20
对您的注释发表评论:如果您搜索bla *,MATCH将返回值blah的列
Wil

5
@Strae The minimum and maximum lengths of words to be indexed are defined by the innodb_ft_min_token_size and innodb_ft_max_token_size for InnoDB search indexes, and ft_min_word_len and ft_max_word_len for MyISAM ones. dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html
卢卡斯Liesis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.