mysql全文索引性能问题

时间:2018-01-09 11:51:23

标签: mysql performance

我有一个包含不同字段的表,特别是名称(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。

其他想法? 再次感谢

2 个答案:

答案 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..AGAINSTJOIN(不带FK)到InnoDB表。 id已经是另一个表的PRIMARY KEY,对吗? JOIN只需要一个索引; PK符合资格;不需要FK。

你有一个2列FULLTEXT索引,对吗? FULLTEXT(name, surname)