blog post cover

GYM Booking - Preview

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

GYM Booking 개요

시리즈 흐름


이 글에서 다루는 것

  • 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;