优化sql查询(mysql)

时间:2015-12-21 23:52:59

标签: mysql performance perl caching

我有一组使用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分钟运行时间的最大罪魁祸首,因为我需要采用哪些可能会大大减少时间?

0 个答案:

没有答案