我正在尝试在 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/