MySQL LIKE运算符与MATCH AGAINST

时间:2013-02-08 15:51:39

标签: mysql match sql-like

您好担心如何实现简单的搜索查询,我的方案是:

tag VARCHAR 255

现在我需要在标记字段内搜索,我可以使用两种查询:

  SELECT * FROM table WHERE tag LIKE '%1111%' OR LIKE '%2222%' OR LIKE '%3333%';

SELECT * ,MATCH(tag) AGAINST('+1111','+2222','+3333' IN BOOLEAN MODE) as score FROM table ORDER BY score DESC ;

哪个更准确/更准确哪个更快?

感谢

3 个答案:

答案 0 :(得分:16)

您的搜索不等同。 LIKE %1%会找到包含1的任何内容,例如1009110.1。它只是一个普通的子串匹配。 MATCH ('+1')理论上可以正常工作,但默认情况下FULLTEXT忽略任何&#34;单词&#34;长度<4个字符。但是,假设您放宽了全文长度限制,+1会找到任何INDEPENDENT 1,但不会找到任何嵌入另一个单词的内容。为此,您需要+*1*

答案 1 :(得分:8)

最快的解决方案是为标记创建一个正确规范化的表,以便每个标记都存储在一个单独的行中。

CREATE TABLE tags (
  tag VARCHAR(4),
  tableid INT,
  PRIMARY KEY (tag, tableid),
  KEY (tableid, tag)
);

SELECT * FROM `table` JOIN tags ON table.tableid = tags.tableid 
WHERE tags.tag IN ('1111', '2222', '3333');

优点:

  • 不再担心全文索引,ft_min_length,InnoDB支持等。
  • 不再担心与LIKE匹配的子字符串的性能不佳。
  • table中查找给定标记及其匹配条目将使用主键索引。
  • table中查找给定条目的标记集使用辅助键索引。
  • table中每个项目的标记数量没有限制。
  • 您可以轻松计算某些标签的频率,您可以获取不同标签的集合,您可以根据查找表约束标签等。

答案 2 :(得分:0)

永远不要使用%1% 这将导致全表扫描,并且如果数据增长则效率非常低。

在字符串值中搜索时,全文在更大的数据集中通常更快。像'text%'

一样使用运算符也很有用