【问题标题】:GROUP_CONCAT Performance issue with distinct and sub_queryGROUP_CONCAT 与 distinct 和 sub_query 的性能问题
【发布时间】:2015-02-21 04:33:57
【问题描述】:

我正在尝试在 MYSQL DB 中执行此查询。

SELECT FirstName,LastName
    CONCAT(COALESCE(Address1, ''),
    COALESCE(Address2, '')) AS Address2,
    (SELECT GROUP_CONCAT(EmpDept ' ') FROM EMP_DEPT
     USE INDEX (EMP_DEPT_IDX)
     WHERE EMP_DEPT.EMP_ID = EMP.EMP_ID) AS DEPT,
    COUNT(PIN) AS PIN,
    MIN(SALARY) AS SALARY,
    GROUP_CONCAT(DISTINCT PAY_CODE SEPARATOR ' ') AS PAYROLL_CODE
FROM EMP WHERE HOUSE='YELLOW' AND HOUSE_AREA='220'
    AND (JOIN_YEAR = '2011' OR JOIN_YEAR = '2012')
    AND EMP_BAND='G'
    AND (FRESHER = 'N' OR FRESHER = 'FALSE')   
    AND PIN IS NOT NULL
    AND SALARY > 0
GROUP BY FirstName,LastName Address3, Address2, DEPT

查询工作正常,我得到了所需的结果集。

唯一的问题是,使用 GROUP_CONCAT 编写的这两行代码对性能有很大影响,

 (SELECT GROUP_CONCAT(EmpDept ' ') FROM EMP_DEPT
    USE INDEX (EMP_DEPT_IDX)
    WHERE EMP_DEPT.EMP_ID = EMP.EMP_ID) AS DEPT


 GROUP_CONCAT(DISTINCT PAY_CODE SEPARATOR ' ') AS PAYROLL_CODE

我尝试添加 INDEX,但仍然没有运气。(只有这些子查询需要大约 30-40 秒才能执行)

我尝试实现 Joins,但由于我是 mysql 新手,所以没有运气..

谁能帮我加快查询的执行速度?

【问题讨论】:

    标签: mysql performance join distinct group-concat


    【解决方案1】:

    该子查询的最佳索引是EMP_DEPT(EMPT_ID, EmpDept)。是你定义的索引吗?

    第二个group_concat() 不能利用索引。

    如果去掉这两行,查询会快多少?

    【讨论】:

      【解决方案2】:

      尝试将相关子查询替换为带有子查询的外连接:

      SELECT FirstName,LastName
          CONCAT(COALESCE(Address1, ''),
          COALESCE(Address2, '')) AS Address2,
          COALESCE(DEPT, '') AS DEPT,
          COUNT(PIN) AS PIN,
          MIN(SALARY) AS SALARY,
          GROUP_CONCAT(DISTINCT PAY_CODE SEPARATOR ' ') AS PAYROLL_CODE
      FROM EMP 
      LEFT JOIN (SELECT EMP_ID, GROUP_CONCAT(EmpDept SEPARATOR ' ') AS DEPT
                 FROM EMP_DEPT
                 GROUP BY EMP_ID) AS EMP_DEPT ON EMP_DEPT.EMP_ID = EMP.EMP_ID
      WHERE HOUSE='YELLOW' AND HOUSE_AREA='220'
          AND (JOIN_YEAR = '2011' OR JOIN_YEAR = '2012')
          AND EMP_BAND='G'
          AND (FRESHER = 'N' OR FRESHER = 'FALSE')   
          AND PIN IS NOT NULL
          AND SALARY > 0
      GROUP BY EMP.EMP_ID
      

      另外,我将最后的 GROUP BY 更改为使用 EMP_ID 列,而不是返回的列值。

      也有可能只需更改最终的GROUP BY 即可解决您的问题。按索引列分组应该更有效,因此请确保您在 EMP_ID 上有一个索引。

      【讨论】:

        猜你喜欢
        • 2021-01-30
        • 2019-01-03
        • 2020-11-14
        • 1970-01-01
        • 2011-03-06
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多