1. Index, 너 잘 타고 있니?
이번에 담당하게 된 프로젝트가 있는데 사이트 로딩 속도가 매우 느렸다.
아래와 같이 쿼리 조회 자체가 안되는 경우도 많아서 쿼리부터 개선 해보자는 마음으로 시작했다.
(웹에서도 관련 기능이 당연히 동작 안하는데, 고객사는 안되는 거라 생각하고 못쓰고 있었다고 한다..😂😂)
소스를 분석하면서 view에서 실행속도가 느리다는 걸 파악했다.
view가 view를 join하고 중첩하여 참조하다보니 실행 속도가 배로 느려진 것..
(이 중 300초 초과되는 검색과 관련된 view는 특정 view를 3번에 걸쳐 참조하고 있었다.)
보안 상의 이유로 view 이름을 공개할 수는 없지만, 위에 표에서 노란색으로 되어 있는 view는 성능이 낮은 모든 view에서 참조하고 있었다. 그래서 해당 view부터 개선하려고 view 코드를 확인했다.
그는 재귀쿼리였다.
말은 거창하게 했지만, 그냥 본인 자체를 한 번 더 참고하고 하는 그런 친구다.
본격적인 쿼리 튜닝을 위해 EXPLAIN 명령어로 인덱스 여부를 잘 타는지 확인하였다.
아래 쿼리를 보면 a라는 테이블이 인덱스를 타지 않는 것을 확인할 수 있었다.
a 테이블이 인덱스 타지 않아 a 테이블이 문제인 줄 알았으나, c 테이블의 컬럼을 주석해보니 c 테이블과 join을 하면서 a 테이블이 인덱스를 타지 못하는 것이였다. c 테이블의 컬럼들을 서브쿼리로 변경해주었다.
모든 테이블이 정상적으로 인덱스를 타니, 실행속도가 5초 중후반이였던 쿼리가 1초 후반대로 개선되었다.