mysql中in之后很慢的优化

1 篇文章 0 订阅

好久没有写博客了,今天碰到一个问题。
单独查询rel_role_res表很快,

运行

select sys_role.* from sys_role where FIND_IN_SET(ROLE_ID,queryRelationRoles(94))

很快,0.2s把

结果运行

select distinct(RES_ID)  from  rel_role_res where 
	ROLE_ID in (select distinct(sys_role.ROLE_ID) from sys_role where FIND_IN_SET(sys_role.ROLE_ID,queryRelationRoles(94))
)

需要4.7s这个很明显不对,单独运行的时候明明都很快,最后排查到可能是in的时候没有使用到索引。优化查询语句为

SELECT DISTINCT(rr.RES_ID)  FROM  rel_role_res rr WHERE EXISTS (
	SELECT t.role_id FROM(
		SELECT DISTINCT(ROLE_ID) FROM sys_role WHERE FIND_IN_SET(ROLE_ID,queryRelationRoles(94))) t 
	WHERE t.role_id=rr.`ROLE_ID`) ORDER BY rr.RES_ID	

结果只需要0.3s,特意记一下免得重复的坑再踩,顺便记录一下MySQL中的递归

BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);
 
SET sTemp = '';
SET sTempChd = CAST(roleId AS CHAR);
 
WHILE sTempChd IS NOT NULL DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(PARENTROLEID) INTO sTempChd FROM rel_role_contain WHERE FIND_IN_SET(CHILDROLEID,sTempChd)>0;
END WHILE;
RETURN SUBSTRING(sTemp,2);
END
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值