【问题标题】:Optimize MySQL query - Data fetching form views table and Main table优化 MySQL 查询 - 数据获取表单视图表和主表
【发布时间】:2018-07-19 19:59:08
【问题描述】:

我正在从 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 表有索引和主键。其余所有表都从视图表中获取。

使用解释查询我有以下输出

【问题讨论】:

    标签: mysql query-optimization


    【解决方案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');
    

    【讨论】:

      【解决方案2】:

      最好把事情从里到外:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-02
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        相关资源
        最近更新 更多