【发布时间】:2015-01-09 11:45:58
【问题描述】:
我有 2 个表 EMP 和 EMP_DTL。我正在使用 LEFT JOIN,如下所示。
SELECT EMPDEL,
EMPYEAR,
EXCODE,
CONCAT(COALESCE(TCODE, ''), COALESCE(INTCODE, '')) AS INTCODE,
( SELECT GROUP_CONCAT(ECODE SEPARATOR ' ') FROM EMP_DTL
WHERE EMP_DTL.DTL_EID = EMP.EID AND ETYPE='') AS ECODE,
COUNT(SSN) AS SSN,
MIN(ESRP) AS ESRP,
GROUP_CONCAT(DISTINCT CURCODE SEPARATOR ' ') AS CURCODE
FROM EMP
WHERE EAND='TOY'
AND EMPYEAR IN ('2014', '2015')
AND EGORY IN('G')
AND (EHIND = 'N' OR EHIND = 'FALSE')
AND EMP.SSN IS NOT NULL
AND ESRP > 0
GROUP BY EMPDEL, EMPYEAR, EXCODE, INTCODE, ECODE
而且表结构是这样的,
CREATE TABLE `emp` (
`EID` varchar(45) NOT NULL,
`ETYPE` varchar(1) NOT NULL,
`SSN` varchar(20) DEFAULT NULL,
`EMPDEL` varchar(4) DEFAULT NULL,
`EMPYEAR` varchar(4) DEFAULT NULL,
`ESCODE` varchar(2) DEFAULT NULL,
`EIAL` varchar(45) DEFAULT NULL,
`EAND` varchar(20) DEFAULT NULL,
`ETUS` char(2) DEFAULT NULL,
`ESRP` varchar(20) DEFAULT NULL,
`EHIND` varchar(20) DEFAULT NULL,
`EGORY` char(1) DEFAULT NULL,
`ECODE` varchar(200) DEFAULT NULL,
`EXCODE` varchar(10) DEFAULT NULL,
`TCODE` varchar(5) DEFAULT NULL,
`INTCODE` varchar(20) DEFAULT NULL,
`CURCODE` varchar(10) DEFAULT NULL,
`EAREA` varchar(5) DEFAULT NULL,
PRIMARY KEY (`EID`),
UNIQUE KEY `EID` (`EID`),
KEY `SSN_IDX` (`SSN`),
KEY `EMPDEL_IDX` (`EMPDEL`),
KEY `EMPYEAR_IDX` (`EMPYEAR`),
KEY `EAREA_IDX` (`EAREA`),
KEY `ETUS_IDX` (`ETUS`),
KEY `EAND_IDX` (`EAND`),
KEY `ESRP_IDX` (`ESRP`),
KEY `EHIND_IDX` (`EHIND`),
KEY `EGORY_IDX` (`EGORY`)
)
CREATE TABLE `emp_dtl` (
`DTL_EID` varchar(45) NOT NULL,
`SSN` varchar(20) DEFAULT NULL,
`ECODE` varchar(45) NOT NULL,
`ETYPE` varchar(45) DEFAULT NULL,
PRIMARY KEY (`DTL_EID`,`ECODE`),
KEY `EMP_DTL_IDX` (`DTL_EID`),
KEY `ETYPE_IDX` (`ETYPE`)
)
问题是 Query 对 10000 条记录执行大约 30 秒。
我尝试在上述查询中添加这些内容以提高性能,
1) 添加“WHERE”子句
2) 在两个表上为 WHERE 子句中的 id 和列添加了适当的索引。
3) 执行执行计划以确保使用我的索引。这是执行计划的输出。
ID SELECT_TYPE TABLE TYPE POSSIBLE_KEYS KEY KEY_LEN REF ROWS EXTRA
=====================================================================================================================================================================================
'1', 'PRIMARY', 'EMP', 'ref', 'SSN_IDX,EMPYEAR_IDX,EAND_IDX,ESRP_IDX,EHIND_IDX, EGORY_IDX', 'EGORY_IDX', '2', 'const', '13', 'Using where; Using filesort'
'2', 'DEPENDENT SUBQUERY', 'EMP_DTL', 'ref', 'PRIMARY,EMP_DTL_IDX,ETYPE_IDX', 'ETYPE_IDX', '48', 'const', '1', 'Using where; Using index'
我应该再添加索引吗? 有人可以帮助我进一步优化此查询以减少执行时间吗?
【问题讨论】:
标签: mysql performance optimization group-by left-join