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

要在数据库中search任何列“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查询findMATCH AGAINST所没有的“xxfoo”。

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

更新

MySQL 5.6及更高版本开始, InnoDB表支持Match... Against


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

LIKE只有在你这样做时才是有效的:

  • 一个列(不是一个函数的结果,除非你的特定数据库供应商支持function索引 – 例如Oracle),你正在使用它们;
  • 列的开始(即LIKE 'blah%' ,而不是LIKE '%blah%' ); 和
  • 一个被索引的列。

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

注意: MATCH上的一个问题是,它似乎只匹配整个单词,所以search“b​​la”将不匹配值为“blah”的列,而是search“bla *”。