我有一组使用DBI从perl脚本运行的查询。 第一个查询获取一组返回的记录 然后我遍历该集合并对返回的每个记录执行额外的查询
查询1:
Select distinct u.CN,u.FIRST,u.LAST,u.FULLNAME,u.CHECK_LS,u.PRODUCTLINE, u.EMAIL, u.PORTAL_ROLE, u.FULLNAME,
( SELECT GROUP_CONCAT(g.GROUP_NAME SEPARATOR ',')
From USERGROUPS g
Where g.USER_CN=u.CN
and u.clientid=g.clientid
and u.batchid= g.batchid
) AS GROUPS,
( SELECT GROUP_CONCAT(r.ROLENAME SEPARATOR ',')
From USERROLES r
Where r.USER_CN=u.CN
and u.clientid=r.clientid
and u.batchid= r.batchid
) AS ROLES
from LSFUSER u
WHERE u.clientid = $clientid
and u.batchid= $batchid
查询2 :(从查询1的每一行获取u.CN和u.identity的值)。
select concat('<IDENTITY ID="',B.CN,'" SERVICE="',B.ID,'" ',B.fld1,' ', B.fld2,'/>') AS IDENLINE
from(select u.CN,i.ID, concat(i.val1,'="', u.val1,'"') as fld1,
CASE WHEN i.val2=0 THEN
concat(i.val2,'="', u.val2,'"')
ELSE
''
END fld2
from IDENTITY i, USERIDEN u
where u.CN=\?
and u.identity=i.ID
and u.identity !=\?
and u.batchid=$batchid
and i.batchid=$batchid
)B
你可以想象这需要一段时间,但我真的好奇这是在这里做的最糟糕的部分,因为有很多事情发生:
a)我在第一个中做了两个group_concat语句。整个声明并不需要很长时间。也许几秒钟(返回4000条记录)
b)我在第二个查询中的sql语句中进行了一些连接,以便在perl脚本中保存一些工作。我知道PERL非常擅长这一点,但我从来不知道这是MySql服务器上特别激烈的事情。
c)我在另一个多结果查询中嵌套了一个多结果查询。我怀疑这可能是我可以获得最佳改进的地方,但由于我需要构建一个模仿这个输出的文件,这个流程对我来说很有意义。
问题是,第一次运行此查询时,它需要10分钟才能完成(处理器为100%,几乎没有使用内存)。 然而,后续时间需要大约1秒,我怀疑是因为查询现在正在被缓存。
我的问题是,这是10分钟运行时间的最大罪魁祸首,因为我需要采用哪些可能会大大减少时间?