반응형
where 절에 function 쓰면 성능이슈가 있다고 한다.
실제로 본적은 많지 않은데... 오늘 장애를 만나면서 그 끝판왕을 보았다.
이슈를 기록하고 튜닝한 내용을 정리한다.
CREATE FUNCTION `xxx`.`FN_DATE_xxx`(varDate datetime) RETURNS datetime
BEGIN
declare varxxx datetime;
declare varDt varchar(8);
set varDt:= FN_YMD_xxx(varDate,'');
SELECT STR_TO_DATE(concat(varDt,'000000'), '%Y%m%d%H%i%s') INTO varxxx
FROM DUAL
;
RETURN varxxx;
END
fucntion에서 다시 function을 호출한다.
fucntion을 분석해보니 현재시간에서 일정기간을 뺀 range를 검색하는 목적으로 만든 듯했다.
개발당시 어떤 이슈가 있었는지는 모르지만 mysql function 레퍼런스를 확인할 시간적 여유가 없었나보다...
이게 쌓이고 쌓여 3년만에 대용량 테이블과 만나서 장애를 일으켰다...
튜닝)
// 수많은 join으로 되어있지만 대용량테이블 하나만 가지고 분석한다. 나머지 테이블 다붙여도 1초 내외이다.
//튜닝전
select * FROM xxxx.xxxxxxx AP
where 1=1
AND AP.REG_DATE BETWEEN xxx.FN_DATE_xxx (xxx.FN_xxx(NOW(),-14)) AND NOW()
//튜닝후
select * FROM xxxx.xxxxxxx AP
where 1=1
AND AP.REG_DATE BETWEEN DATE_FORMAT(DATE_SUB(NOW(), interval 14 day),'%Y-%m-%d 00:00:00') and NOW()
튜닝전)
1) 플랜 : 1 SIMPLE AP ALL REG_DATE 422277 11.11 Using where
2) 수행시간 : 51초
튜닝후)
1) 플랜 : 1 SIMPLE AP range REG_DATE REG_DATE 5 23128 100 Using index condition
2) 수행시간 : 0.83초
where 조건절에는 웬만하면 function 쓰면 안되고 어쩔 수 없이 쓰더라도
mysql에서 기본으로 제공하는 function을 사용하는 것이 좋다.
반응형
'RDB > mysql' 카테고리의 다른 글
[튜닝] 니 형이 뭐야? (0) | 2020.04.13 |
---|---|
slave online hot backup 구축 (0) | 2020.04.11 |
mysql 컬럼 타입 datetime vs timestamp 차이 (0) | 2020.04.08 |
[error] mysqldump: Got errno 28 on write (0) | 2020.04.02 |
SSD 파티션 튜닝 2 (0) | 2020.03.31 |