mysql - GROUP_CONCAT 不同查询和子查询的性能问题

标签 mysql performance join distinct group-concat

我正在尝试在 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 秒来执行)

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

任何人都可以帮助我加快查询执行速度吗?

最佳答案

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

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 上有索引.

关于mysql - GROUP_CONCAT 不同查询和子查询的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27613496/

相关文章:

mysql - Ruby - mysql 中的数组执行

string - 字符串插值与串联

MySQL:根据已选行中的值选择行

javascript - 使用 React 突出显示列表中的项目时的性能

java - ListView 内的 ListView 项目

join - Hadoop的Map-side join实现Hash join?

mysql - 如何在 SQL 查询中 JOIN 父级的类别表?

PHPMyAdmin 在外键设置上抛出错误

php - 在 codeigniter 中显示具有特定日期的记录

php - 在单个查询中条件驱动的 INSERT 和 UPDATE