【问题标题】:MySQL LIKE operator Vs MATCH AGAINSTMySQL LIKE 运算符与 MATCH AGAINST
【发布时间】:2013-01-24 10:36:33
【问题描述】:

您好我很担心如何实现一个简单的搜索查询,我的场景是:

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 ;

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

谢谢

【问题讨论】:

  • 注意:默认情况下,匹配对少于 4 个字符无效
  • 是的,我只知道一个例子;)

标签: mysql match sql-like


【解决方案1】:

您的搜索不相等。 LIKE %1% 将找到包含 1 的任何内容,例如1009110.1。这只是一个普通的子字符串匹配。 MATCH ('+1') 理论上可行,但 FULLTEXT 默认忽略任何长度小于 4 个字符的“单词”。但是,假设您放宽全文长度限制,+1 会找到任何独立的1,但不会找到任何嵌入在另一个单词中的内容。为此,您需要+*1*

【讨论】:

  • 该死的你用 10 行总结了我需要知道的所有内容,谢谢:),我很快就会接受..
【解决方案2】:

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

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 中每个项目的标签数量没有限制。
  • 您可以轻松计算某些标签的频率,您可以获取一组不同的标签,您可以根据查找表限制标签等。

【讨论】:

    【解决方案3】:

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

    在字符串值中搜索时,全文通常在更大的数据集中更快。像 'text%' 这样使用时,like 运算符很有用

    【讨论】:

    • -1 抱歉,但您应该检查一下我的答案 -1 我只是在使用一个示例,而且我已经编辑过了
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2012-03-15
    • 2011-11-10
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多