안녕하세요 속도 질문 드립니다.
MYSQL을 사용중인데요
아래 쿼리를 실행시키면 10분이상 걸려서 개선할 수 있는 방법을 여쭤봅니다.
NOT EXISTS 위로는 문제없이 잘 실행되는데요
NOT EXISTS 해당 쿼리를 포함해서 실행하면 너무 오래걸리는데 이게 혹시 데이터 건수문제인지
인덱스나 별도 다른 문제인지 쿼리가 잘못된건지 질문드려요 이렇게 비교할 때는 다른 방법은 떠오르지는 않아서요 ..
혹시 몰라서 맨 아래 테이블 컬럼도 첨부합니다.
SELECT count(*)
FROM tn_mer a
INNER JOIN tn_mer_pan b
ON a.mer_sn=b.mer_sn
WHERE 1=1
AND a.member ='N'
AND ifnull(a.email_yn, 'Y') = 'Y'
AND b.pan_secsn = 'N'
AND b.birth < ((YEAR(NOW())-14)+1)
AND NOT EXISTS
(SELECT *
FROM tn_only_result s1
WHERE a.mer_sn = s1.mer_sn
AND s1.only_sn = 180
) ;
-- 31140 건
TABLE `tn_mer` (
`mer_sn` bigint(20) NOT NULL AUTO_INCREMENT ,
`mer_id` varchar(50) NOT NULL,
`passwd` varchar(100) NOT NULL,
`mtlnum` varchar(20) NOT NULL,
`creat_dttm` datetime NOT NULL,
`updt_dttm` datetime NOT NULL,
`login_dttm` datetime DEFAULT NULL,
`visit` bigint(20) NOT NULL DEFAULT '0' COMMENT '방문 수',
`mngr_dc` mediumtext,
`secsn` char(1) NOT NULL DEFAULT 'N',
`secsn_dt` datetime DEFAULT NULL,
`sms_yn` varchar(1) DEFAULT 'Y',
`email_yn` varchar(1) DEFAULT 'Y',
`recommender` varchar(50) DEFAULT NULL,
`member` char(1) NOT NULL DEFAULT 'N',
`vySn` int(11) DEFAULT NULL,
PRIMARY KEY (`mer_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-- 15853건
TABLE `tn_mer_pan` (
`mer_sn` bigint(20) NOT NULL DEFAULT '0',
`pan_grad` bigint(20) NOT NULL DEFAULT '0',
`dnc_code` bigint(20) NOT NULL DEFAULT '0',
`birth` int(11) NOT NULL DEFAULT '0',
`sexdstn` varchar(1) NOT NULL,
`cp_code` bigint(20) NOT NULL DEFAULT '0',
`pan_secsn` char(1) NOT NULL DEFAULT 'N',
`pan_secsn_dt` datetime DEFAULT NULL ,
`gion_code` bigint(20) NOT NULL DEFAULT '0',
`acmcr_code` bigint(20) NOT NULL DEFAULT '0',
`inn_code` bigint(20) NOT NULL DEFAULT '0',
`join_code` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`mer_sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 112842
TABLE `tn_only_result` (
`only_result_sn` bigint(20) NOT NULL AUTO_INCREMENT ,
`only_sn` bigint(20) NOT NULL DEFAULT '0',
`mer_sn` bigint(20) NOT NULL DEFAULT '0',
`creat_dt` datetime NOT NULL,
`creat_ip` varchar(15) DEFAULT NULL,
PRIMARY KEY (`only_result_sn`,`only_sn`,`mer_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
드라이빙 b 테이블 기준으로
SELECT straight_join count(*) FROM tn_mer_pan b INNER JOIN tn_mer a ON b.mer_sn=a.mer_sn WHERE 1=1 AND a.member ='N' AND ifnull(a.email_yn, 'Y') = 'Y' AND b.pan_secsn = 'N' AND b.birth < ((YEAR(NOW())-14)+1) AND NOT EXISTS (SELECT * FROM tn_only_result s1 WHERE a.mer_sn = s1.mer_sn AND s1.only_sn = 180 ) ;