要搜索数据库中任何列“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没有。
哪一个是首选的,还是有更好的解决方案?
答案 0 :(得分:62)
自MySQL 5.6
及更高版本开始,InnoDB
表格支持Match... Against
。
第一个是更多更好。在 MyISAM 表格中,它将对这些列使用全文索引。另一个将进行全表扫描,在每一行上进行连续,然后进行比较。
LIKE
只有在您执行此操作时才有效:
LIKE 'blah%'
而不是LIKE '%blah%'
);和如果其中任何一个条件不正确,则SQL引擎执行查询的唯一方法是执行全表扫描。这可以在大约10-20,000行下使用。除此之外,它很快变得无法使用。
注意:关于MySQL的MATCH的一个问题是,它似乎只匹配整个单词,因此搜索'bla'将不匹配值为'blah'的列,但是搜索'bla *'会。