您好担心如何实现简单的搜索查询,我的方案是:
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 ;
哪个更准确/更准确哪个更快?
感谢
答案 0 :(得分:16)
您的搜索不等同。 LIKE %1%
会找到包含1
的任何内容,例如100
,911
,0.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');
优点:
LIKE
匹配的子字符串的性能不佳。 table
中查找给定标记及其匹配条目将使用主键索引。table
中查找给定条目的标记集使用辅助键索引。table
中每个项目的标记数量没有限制。答案 2 :(得分:0)
永远不要使用%1% 这将导致全表扫描,并且如果数据增长则效率非常低。
在字符串值中搜索时,全文在更大的数据集中通常更快。像'text%'
一样使用运算符也很有用