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