MySQL LIKE运算符与MATCH AGAINST

its*_*sme 5 mysql match sql-like

嗨,我担心如何实现一个简单的搜索查询,我的方案是:

tag VARCHAR 255
Run Code Online (Sandbox Code Playgroud)

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

  SELECT * FROM table WHERE tag LIKE '%1111%' OR LIKE '%2222%' OR LIKE '%3333%';
Run Code Online (Sandbox Code Playgroud)

要么

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

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

谢谢

Mar*_*c B 16

您的搜索不相同.LIKE %1%会发现任何包含1,例如100,911,0.1.这只是一个普通的子串匹配.MATCH ('+1')理论上可以工作,但默认情况下FULLTEXT忽略任何长度<4个字符的"单词".但是,假设您放宽了全文长度限制,+1则会发现任何1不相关的内容,而不是任何嵌入在另一个单词中的内容.为此您需要+*1*.

  • 该死的,你把我需要知道的所有内容总结为 10 行,谢谢:),我很快就会接受.. (2认同)
  • 您能解释一下“假设您放宽全文长度限制”是什么意思吗? (2认同)

Bil*_*win 10

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

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');
Run Code Online (Sandbox Code Playgroud)

优点:

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