引言
模糊搜索时,用like '%XXX%' 方式匹配了4个字段,同时数据量较大(百万级),导致查询sql结果1分钟左右。
解决方向:
1.技术层面解决
2.业务层面解决
问题sql
sql:select count(id) from push_item where tenant_id = 'wxirv8j9' and relation_item_name like '%员工假期台账%' or rule_item_name like '%员工假期台账%' or source_form_template_name like '%员工假期台账%' or target_form_template_name like '%员工假期台账%'
技术层面解决
使用ES搜索
优点:专业的搜索引擎
缺点:我们项目中该数据为单据转换的日志数据,不是重要数据,考虑到成本问题还是不用ES了
使用MySQL-全文索引
全文索引
// 增加索引
ALTER TABLE push_item
ADD FULLTEXT INDEX i_fulltext (`relation_item_name`,`rule_item_name`,`source_form_template_name`,`target_form_template_name`);
// 修改后的sql
select count(id) from push_item where tenant_id = 'wxirv8j9' and MATCH(relation_item_name, rule_item_name, source_form_template_name, target_form_template_name) AGAINST('员工假期台账')
优点:不需要增加额外成本
缺点
1.特定场景可能和like查询结果不一致
2.不一定可以兼容多数据库场景
3.增加维护全文索引耗时,可能会影响增删改性能
业务层面解决
将这几个字段分开搜索,不要一下模糊匹配多个字段