哪个SQL查询更好,MATCH AGAINST或LIKE?
要在数据库中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查询findMATCH AGAINST所没有的“xxfoo”。
哪一个是首选的,还是有更好的解决scheme?
更新
从MySQL 5.6
及更高版本开始, InnoDB
表支持Match... Against
。
第一个好多了。 在MyISAM表上,它将对这些列使用全文索引。 另一个会做一个全表扫描每行进行concat,然后进行比较。
LIKE
只有在你这样做时才是有效的:
- 一个列(不是一个函数的结果,除非你的特定数据库供应商支持function索引 – 例如Oracle),你正在使用它们;
- 列的开始(即
LIKE 'blah%'
,而不是LIKE '%blah%'
); 和 - 一个被索引的列。
如果这些条件中的任何一个不是真的,则SQL引擎执行查询的唯一方法是执行全表扫描。 这可以在大约10-20万行下使用。 除此之外,它很快就变得无法使用。
注意: MATCH上的一个问题是,它似乎只匹配整个单词,所以search“bla”将不匹配值为“blah”的列,而是search“bla *”。