要在数据库中搜索在"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 query不能。
哪一个是首选的,还是有更好的解决方案?
发布于 2009-04-27 09:46:47
更新
从MySQL 5.6
及更高版本开始,InnoDB
表支持Match... Against
。
第一个是much better。在MyISAM表上,它将对这些列使用全文索引。另一个将执行全表扫描,对每一行进行连接,然后进行比较。
只有在以下情况下,LIKE
才是有效的:
LIKE 'blah%'
,而不是LIKE '%blah%'
);如果其中任何一个条件不为真,SQL引擎执行查询的唯一方法就是执行全表扫描。这可以在大约10-20000行的情况下使用。除此之外,它很快就会变得不可用。
注意:在MySQL上匹配的一个问题是,它似乎只匹配整个单词,因此搜索“bla”不会匹配值为“blah”的列,但搜索“bla*”将匹配。
https://stackoverflow.com/questions/792875
复制相似问题