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 只有你这样做才有效率:
LIKE 'blah%'相反LIKE '%blah%'); 和如果这些条件中的任何一个不正确,则SQL引擎执行查询的唯一方法是执行全表扫描.这可以在大约10-20,000行下使用.除此之外,它很快变得无法使用.
注意:关于MySQL的MATCH的一个问题是它似乎只匹配整个单词,所以搜索'bla'将不匹配值为'blah'的列,但搜索'bla*'将会.