我有一个包含不同字段的表,特别是名称(varchar 255),姓氏(varchar 255),但实际上我将它们用作名称(varchar 90)和surname(varchar 70),考虑到maxlength限制。
这个表有大约620,000行,我正在做很多查询,如下所示:
SELECT * FROM table WHERE name LIKE "%word1%" AND surname LIKE "%word2%"
我在两个字段上都添加了FULLTEXT索引(尝试过一个索引包含两个字段),但性能比没有任何索引的查询慢。
我错过了什么?
提前致谢
编辑: 回复后,我会向您展示一些结果。
案例A. 没有任何索引的表 查询:
SELECT *
FROM `table`
WHERE `name` LIKE '%word1%'
AND `surname` LIKE '%word2%'
执行两次在0.8870和0.8952秒
解决案例B. 我在名字上添加了一个FULLTEXT索引,在姓氏上添加了一个FULLTEXT索引。 查询
SELECT *
FROM table
WHERE match(name) AGAINST ('+word1*' in boolean mode)
AND match(surname) AGAINST ('+word2*' in boolean mode)
执行两次在0.9647和1.0380秒中解决
注意:表有InnoDB引擎,不幸的是MySQL早于5.6;由于外键,我无法轻易地从InnoDB转换为MyISAM。
其他想法? 再次感谢
答案 0 :(得分:3)
如果你在布尔模式下使用Mysql(InnoDB)的全文搜索会更好。 更多详情here
全文搜索旨在与您的情况一样高效,并且比完全扫描速度快得多。
针对您的案例的全文搜索查询可能如下所示:
SELECT * FROM table WHERE match(name) against ('+word1*' in boolean mode) AND match(surname) against ('+word2*' in boolean mode);
答案 1 :(得分:0)
“无法轻易转换” - 当然可以。创建一个MyISAM表,只包含文本列和id。然后使用该表MATCH..AGAINST
和JOIN
(不带FK)到InnoDB表。 id
已经是另一个表的PRIMARY KEY
,对吗? JOIN
只需要一个索引; PK符合资格;不需要FK。
你有一个2列FULLTEXT
索引,对吗? FULLTEXT(name, surname)