GROUP BY와 COUNT 를 사용해 모든 태그를 갖고 있는 여행기를 찾는 쿼리WHERE id IN 절 사용: travelogue_tag에서 GROUP BY와 COUNT를 통해 먼저 조건을 만족하는 여행기를 찾고 여행기 테이블에서 IN 절을 통해 조건에 맞는 여행기를 찾는 쿼리travelogue_tag 에서 찾고 여행기 테이블에 JOIN 반복을 통해 모든 태그를 갖고 있는 여행기를 찾는 쿼리IN 대신 EXISTS 를 사용하는 쿼리IN 대신 JOIN을 사용하는 쿼리지금 현재는 가장 위의 쿼리를 사용 중이지만 더 좋은 성능의 쿼리로 대체하거나 개선할 수 있을 것 같다.
여행기는 테스트 데이터 10만 개를 삽입하고 태그는 실제 서비스와 동일하게 17개를 삽입해서 성능을 측정해 봤다.
| 태그 3개 필터 | 1 | 2 | 3 | 평균 |
|---|---|---|---|---|
| JOIN 후 집계 | 0.224 | 0.229 | 0.224 | 0.225 |
| IN 절 사용 | 0.130 | 0.134 | 0.131 | 0.131 |
| 다중 JOIN | 0.042 | 0.048 | 0.042 | 0.044 |
| EXISTS 사용 | 0.071 | 0.051 | 0.062 | 0.061 |
| 서브쿼리와 한번 JOIN | 0.129 | 0.127 | 0.116 | 0.124 |
| 태그 1개 필터 | 1 | 2 | 3 | 평균 |
|---|---|---|---|---|
| JOIN 후 집계 | 0.216 | 0.212 | 0.221 | 0.216 |
| IN 절 사용 | 0.022 | 0.023 | 0.023 | 0.023 |
| 다중 JOIN | 0.0018 | 0.0010 | 0.0010 | 0.0013 |
| EXISTS 사용 | 0.0017 | 0.0018 | 0.0011 | 0.0015 |
| 서브쿼리와 한 번 JOIN | 0.037 | 0.044 | 0.038 | 0.040 |
10만 개 기준으로 지금 현재 사용 중인 쿼리의 경우 고려한 5가지 쿼리 중 가장 저조한 성능을 보이고 있다.
당장 쿼리 중에선 다중 JOIN, 그 다음으로는 EXISTS를 사용하는 방법이 가장 빠르지만 모든 쿼리의 성능을 최대한으로 끌어올린 후 비교를 다시 진행해보자. 5가지 쿼리들의 실행계획을 분석하면서 복합 인덱스를 추가한다면 더욱 성능을 끌어올릴 수 있을 것 같다.
여행기 10만개 기준