要在数据库中搜索“foo_desc”和“bar_desc”任意列中同时具有关键字“foo”和“bar”的行,我会执行以下操作:
SELECT *
FROM t1
WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST ('+foo* +bar*' IN BOOLEAN MODE)
or
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 找不到。
哪一个是首选或者有更好的解决方案?
Update
As of MySQL 5.6
然后,InnoDB
桌子支撑Match... Against
.
第一个是much更好的。在MyISAM表它将对这些列使用全文索引。另一个将进行全表扫描,对每一行进行连接,然后进行比较。
LIKE
仅当您针对以下情况进行操作时才有效:
- 一列(不是函数的结果,除非您的特定数据库供应商支持函数索引(例如 Oracle)并且您正在使用它们);
- 列的开头(即
LIKE 'blah%'
相对于LIKE '%blah%'
); and
- 已索引的列。
如果其中任何一个条件不成立,SQL 引擎执行查询的唯一方法就是进行全表扫描。这可以在大约 10-20,000 行下使用。但除此之外,它很快就会变得无法使用。
Note:MySQL 上的 MATCH 的一个问题是,它似乎只匹配整个单词,因此搜索“bla”不会匹配值为“blah”的列,但搜索“bla*”会匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)