11

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

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

3 回答 3

26

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

于 2013-02-08T15:55:57.863 回答
13

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

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
  • 您可以轻松计算某些标签的频率,您可以获取一组不同的标签,您可以根据查找表限制标签等。
于 2013-02-08T16:38:18.467 回答
0

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

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

于 2013-02-08T16:17:45.263 回答