더미데이터 삽입 목적
데이터 용량이 만 단위를 넘어서게 되면 쿼리의 성능이 어떻게 나오는지 파악하고, 만약 성능이 안좋다면 이를 개선하기 위함.
마이페이지 관련 테이블 정보
총 3가지 테이블
- member (회원 정보)
- sbd (회원의 운동 수행 능력 정보, 3대 운동 중량)
- member_gym (회원이 등록한 헬스장 정보 - 최대 2개 까지 가능)
member와 sbd는 일대다
관계
member와 member_gym도 일대다
관계
memer_gym과 sbd는 무슨 차이가 있는가?
- member_gym은 한 회원당 2개까지만 생성 가능, 만약 추가 생성을 한다면 이전에 생성된 테이블은 소프트 삭제 처리
- sbd는 한 회원당 무한으로 생성 가능, 마이페이지 조회 시에 최신 sbd 정보만 조회
마이페이지 관련 더미데이터 삽입
🌟 Member Table 1,000,000건의 데이터 생성


🌟 Sbd Table 2,000,000건의 데이터 생성
한 멤버당 sbd 더미 데이터 2개 생성 → 1,000,000 * 2 = 총 2,000,000 건


🌟 Member_Gym Table 2,000,000건의 데이터 생성
한 멤버당 Member_Gym 더미데이터 2개씩 생성 → 1,000,000 * 2 = 총 2,000,000건


통합 DB 파일 용량

마이페이지 조회 로직 분석
1. 토큰을 통한 마이페이지 정보 조회
- OAuth2 로그인을 통하여 회원의 Id 정보를 추출한다.
- 회원의 id정보를 바탕으로 마이페이지 정보를 조회한다.
2. 회원 아이디를 통한 마이페이지 정보 조회
- PathVariable에 명시된 memberId를 바탕으로 회원 정보를 조회한다.
자기 자신의 마이페이지 정보를 조회할 때는 무조건 토큰을 통한 마이페이지 정보를 조회해야 한다. 자기 자신의 memberId가 무엇인지 모르기 때문에
따라서 쿼리 성능 테스트 범위는 Oauth2 로그인 ~ mypage 정보를 받기 까지로 설정한다.
마이페이지 조회 로직 쿼리 성능 측정
결과
마이페이지 조회 결과 전체 0.01초 밖에 걸리지 않았다. 수백만건의 데이터를 조회하는데 이렇게 쿼리 성능이 좋은 이유가 뭘까?
이는 MySQL DBMS의 특징인데, Unique 칼럼에 대하여 기본적으로 Index 설정을 해주기 때문이다.
토큰을 통한 마이페이지 정보 조회에서 가장 성능적으로 안좋은 부분은 회원의 정보를 이메일을 바탕으로 찾는 부분인데, 이메일 자체가 Unique 속성으로 되어있기 때문에 MySQL에서 Index설정을 해주기 때문에 성능상에 문제가 없는 것이다.

Member 테이블에 email 칼럼에 Unique 타입으로 Index가 걸려있는걸 확인할 수 있다.
만약 인덱스를 제거하면 성능이 어떻게 될까?
Unique 칼럼에 대한 Index를 제거했을 경우 쿼리 성능

100만 건의 데이터 중에서 특정 email을 인덱스 없이 찾는다면 1.3초가 걸린다.
실무적으로 1초가 넘는 쿼리 성능은 쓸 수 없는 성능이라고 할 수 있다.
만약 다른 DBMS를 사용했다면 꼭 회원의 email에 인덱스를 걸어줘야 성능상의 이슈를 해결할 수 있을 것으로 생각된다.
그렇다면 회원 정보 조회 말고 다른 쿼리의 성능들은 어떨까?
- 회원이 등록한 헬스장 정보를 조회할 때 쿼리 결과 (0.015초)

200만건의 MemberGym 테이블에서 특정 회원 번호를 가지는 데이터를 찾는데 0.015초 밖에 안걸렸다.
그 이유 또한 인덱스에서 찾을 수 있다

이는 대부분의 주요 DBMS(Mysql, Oracle, PostgreSql)이 지원하는 기능이다. 외래키에 대해 자동으로 인덱스를 생성해주는데, 이를 통해 효율적인 조인 연산과 데이터 무결성을 유지할 수 있다.
- 회원이 등록한 운동 수행 능력(Sbd) 조회 결과(0.06초)

이것 또한 쿼리 수행시간이 짧은 이유는 외래키에 대한 자동 인덱스 설정이 되어있기 때문이다.
마이페이지 조회 성능 측정 결과
마이페이지 조회에서 가장 성능적인 문제가 되는 부분은 인증/인가에서 email을 통한 회원 정보 조회 부분이다. 하지만 MySQL의 Unique 칼럼에 대하여 자동으로 Index를 걸어주는 특징 때문에 해당 문제를 수월하게 해결할 수 있었다.
'DB' 카테고리의 다른 글
JPA 관련 주의 사항 정리 (0) | 2023.08.28 |
---|---|
DB 인덱스 실습 (0) | 2023.05.31 |
옵티마이저란? (0) | 2023.05.19 |
DB 쿼리 성능을 개선해보자 (0) | 2023.04.05 |
식별관계와 비식별관계 (0) | 2023.03.28 |