优化MySQL查询 - 数据获取表单视图表和主表

时间:2018-02-09 05:23:16

标签: mysql query-optimization

我从MySQL视图表和主表中获取数据。我在主表中创建了索引和主键,但我无法在视图表上创建索引和主键。

当我执行以下查询时,大约需要10秒钟。我希望将以下查询优化为更短的时间。

SELECT DISTINCT
    `Emp_No`, `Name`
FROM
    `ResLookup`
WHERE
    `IsActive` = 1
        AND `Department` IN ('SDG' , 'HDD', 'ENG', 'PDN')
        AND (`Emp_No` IN (SELECT DISTINCT
            ProjList.PM_No
        FROM
            ProjList
        WHERE
            ProjList.PM_No != 1749 UNION SELECT DISTINCT
            ProjList.PL_No
        FROM
            ProjList
        WHERE
            ProjList.PL_No != 1749)
        OR Emp_No IN (SELECT 
            MEMBER_ID
        FROM
            s_group_details
        WHERE
            GROUP_ID = 'GRP109'
                AND MEMBERSHIP_LEVEL = 30));

只有s_group_details表具有索引和主键。剩余的所有表都是从视图表中获取的。

使用Explain Query我有以下输出

enter image description here

2 个答案:

答案 0 :(得分:1)

我不知道您的查询要求,但仍然检查以下查询是否有帮助

SELECT DISTINCT
    `Emp_No`, `Name`
FROM
    `ResLookup` inner join (SELECT DISTINCT
            ProjList.PM_No ,ProjList.PL_No
        FROM
            ProjList
        WHERE
            ProjList.PM_No != 1749 
            or
            ProjList.PL_No != 1749) a
            on ResLookup.Emp_No = a.PM_No
            and ResLookup.Emp_No = a.PL_No
            OR Emp_No IN (SELECT 
            MEMBER_ID
        FROM
            s_group_details
        WHERE
            GROUP_ID = 'GRP109'
                AND MEMBERSHIP_LEVEL = 30)
WHERE
    `IsActive` = 1
        AND `Department` IN ('SDG' , 'HDD', 'ENG', 'PDN');

答案 1 :(得分:0)

最好将内容转变为内外:

SELECT  `Emp_No`, 
        ( SELECT  Name
            FROM  ResLookup
            WHERE  Emp_No = u.PM_No 
        ) AS Name
    FROM  
        ( SELECT  PM_No FROM  ProjList WHERE  PM_No != 1749 )
        UNION DISTINCT
        ( SELECT  PL_No FROM  ProjList WHERE  PL_No != 1749 )
        UNION DISTINCT  
        ( SELECT  MEMBER_ID
            FROM  s_group_details AS d
            WHERE  d.GROUP_ID = 'GRP109'
              AND  d.MEMBERSHIP_LEVEL = 30 
        ) AS u
    JOIN  `ResLookup` AS r  ON u.PM_No = r.Emp_No
    WHERE  r.`IsActive` = 1
      AND  r.`Department` IN ('SDG' , 'HDD', 'ENG', 'PDN');

所需索引:

ResLookup:  (Emp_No, IsActive, Department)
s_group_details:  (GROUP_ID, MEMBERSHIP_LEVEL, MEMBER_ID)