2013-02-08 75 views
3

嗨,我是担心如何实现一个简单的搜索查询,我的方案是:MySQL的LIKE操作Vs的对阵

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 ; 

其更accurated /精确和更快?

感谢

+3

警告:对阵不会少于4个工作字符默认 – simplyray 2013-02-08 15:56:58

+0

是的,我只知道一个例子;) – sbaaaang 2013-02-08 15:57:12

回答

14

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

+0

该死的你总结了10行所有我需要知道的谢谢:),我会尽快接受.. – sbaaaang 2013-02-08 15:58:05

0

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

当在字符串值中进行搜索时,整个文本在更大的数据集中通常会更快。像运营商一样使用它像'text%'

+0

-1对不起,但你应该检查更好的答案-1我只是使用一个例子,再加上我已经编辑过 – sbaaaang 2013-02-08 17:07:38

7

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

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中每件商品的标签数量没有限制。
  • 您可以轻松地计算某些标签的频率,就可以获取组不同的标签,你可以约束标签对一个查找表等