我有一个包含不同字段的表,特别是姓名 (varchar 255)、姓氏 (varchar 255),但考虑到最大长度限制,实际上我将它们用作姓名 (varchar 90) 和姓氏 (varchar 70)。
这个表有大约 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。
其他想法? 再次感谢
最佳答案
如果用Mysql(InnoDB)的全文搜索boolean模式会更好。 更多详情 here
全文搜索旨在高效处理像您这样的情况,并且比全文搜索快得多。
针对您的案例的全文搜索查询可能如下所示:
SELECT * FROM table WHERE match(name) against ('+word1*' in boolean mode) AND match(surname) against ('+word2*' in boolean mode);
关于mysql全文索引性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48167623/