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

时间:2009-04-27 09:44:22

标签: sql mysql 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)

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

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

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

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

1 个答案:

答案 0 :(得分:62)

更新

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


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

LIKE只有在您执行此操作时才有效:

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

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

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