MySQL版本:5.7.19
1、需求场景
a) 表说明:商品分类关系表[t_class_product],[classId] 分类主键,fn_class_childs(1) 返回所有子分类主键字符串;
b) 功能说明: 依据 分类主键 查询该分类下的所有商品
2、问题定位
a) 之前操作:新上传几千个商品,然后就发现查询数据非常慢,长达10多秒;
b) 开始以为 [fn_class_childs()] 函数执行慢,结果执行非常快;
c) 然后怀疑是不是 [FIND_IN_SET] 函数 查询数据多就非常慢,
然后查找函数的效率问题,但发现至少查询几十,上百万数据才有影响,而且也不会需要10几秒的时间;
d) 结果分开查询都很快, 合起来就慢的很,使用 explain 分析也没发现什么问题,最后怀疑可能每次比较都可能调用函数[fn_class_childs()]
3、解决方式
a) 既然找到可能的问题,就自然想到缓存查询函数结果,但又不想改的太复杂;
原理:先将查询结果作为临时表,再进行Find In Set
有话要说