gym_bookingDB 구성 및 더미 데이터 삽입부터 실제 쿼리, EXPLAIN 결과를 근거로 판단하고 수정한 과정을 그대로 기록한 아티클이다.


이 글에서 다루는 것
gym_booking데이터셋의 조인 경로 이해- EXPLAIN/EXPLAIN ANALYZE로 병목을 규정하는 방법
- 인덱스 추가가 실제로 효과가 있었는지 판단하는 기준
- 조건을 재작성해 실행 계획을 바꾸는 과정
다루지 않는 것
- 샤딩, 파티셔닝 같은 구조적 확장
- ORM 튜닝이나 애플리케이션 캐싱
- 스토리지 엔진 비교
실습 환경
- MySQL 8 (Docker)
- 데이터베이스:
gym_booking - 대량 더미 데이터 (users 100만, user_memberships 약 90만)
여기서는 DB 이름을 gym_booking으로 통일했다. 같은 이름을 쓰면 스크립트와 문서가 어긋나지 않는다.
대표 쿼리 미리보기
핵심 쿼리는 “헬스장별 활성 회원 수”다. 이 쿼리를 기준으로 병목을 확인하고, 인덱스와 조건을 개선한다.
EXPLAIN ANALYZE
SELECT g.id AS gym_id, g.name,
COUNT(*) AS active_members_count
FROM gyms g
JOIN memberships m ON m.gym_id = g.id
JOIN user_memberships um ON um.membership_id = m.id
WHERE NOW() BETWEEN um.started_at AND um.ended_at
GROUP BY g.id, g.name
ORDER BY active_members_count DESC
LIMIT 10;