mysql中in之后很慢的优化

好久没有写博客了,今天碰到一个问题。
单独查询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

你可能感兴趣的:(in,mysql)