성능 비교의 기초

최대한 자세하게 어떤 일이 있었는지 설명해주세요. 어떤 배경에서 어떤 지식을 활용했는지, 어떤 것들을 배웠는지, 어떤 것들을 느꼈고 왜 그렇게 느꼈는지 등을 정리하면 좋습니다.

[팔구삼 프로젝트 - 구름 프로펙트] 검색 조회 쿼리 성능 개선 - 1편

상황: 어떤 문제가 있었나?

구름 프로펙트에서 진행하는 우리 프로젝트에서 검색 쿼리의 성능이 너무 느렸다. 개발 초기에는 몰랐지만 JOIN 4번에 ORDER BY 정렬에 GROUP BY 집계가 모두 짬뽕이 되어 있어서 데이터가 많아지면 필연적으로 느려질 수밖에 없었다. 데이터가 100개 정도로 적었을 때는 문제가 드러나지 않았다. 경매 기록 130만 건, 입찰 기록 1200만 건, 좋아요 기록 2000만 건, 더미 사용자 데이터 1000건, 경매 이미지 URL 데이터 400만 건 정도를 생성하니 심각한 성능 저하가 발생했다. API 요청 후 응답에 10초씩 걸리고, DB에 직접 연결해서 쿼리를 확인해보니 레코드 개수가 많은 데이터는 30초가 넘게 걸리기도 했다.

그래서 실행 계획을 보면서 내 쿼리가 어떻게 조회되고 어느 부분이 병목지점인지 판별하는 능력이 필요했다. 한번도 쿼리 성능 측정을 해 본 경험이 없었기에 박재성님의 MySQL 성능 개선 강의를 먼저 학습했다.

접근: 어떤 기술로 어떻게 해결했나? / 사고 과정 설명하기

가장 먼저 한 것은 어떤 식으로 SQL문을 개선할 수 있을지 생각하는 것이었다. 예전에 인덱스를 생성하고 실행 계획을 분석하면서 SQL 성능을 개선할 수 있다는 사실을 들었다.

그러면 이제 내 문제 상황을 정의하면 실행 계획을 분석해야 하는데, 처음 해보는 거라 하는 방법을 모른다는 것이었다. 일단은 먼저 EXPLAIN/EXPLAIN ANALYZE명령을 실행시켜 보면서 어떤 식으로 데이터가 나오는지 감을 잡았다. 읽어보려고 했는데 도저히 모르겠어서 강의를 참고하려고 했다. 이런 이유에서 먼저 박재성님의 MySQL 성능 개선 강의를 들으러 갔다. 그 과정에서 어떻게 성능 개선을 하는지 여러 예시를 확인했고 대부분 인덱스를 어떻게 하면 잘 생성할 지에 대한 내용이었다.

여러 번 실행 계획을 실행시켜보면서 어떤 식으로 읽어야 할 지 감을 잡아나가는 과정이 있었다. 대상 쿼리는 아래와 같다. 우리가 검색으로 사용하는 동적 쿼리에서 몇 가지 조건을 빼고 실제 사람들이 검색할 법한 쿼리로 설정했다.

첫 번째 실험 - 현재 쿼리의 상태 점검 및 분석

실행 계획

실행 계획

10회의 조회

10회의 조회