카테고리 없음

오늘의 문제는 max min 구하기 입니다.

gw1 2025. 8. 19. 17:41
CREATE TABLE `user` (
  `id` int NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `dormant` enum('Y','N') DEFAULT 'N',
  `purchase_amount` int DEFAULT '0',
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`),
  KEY `idx_dormant` (`dormant`),
  KEY `idx_purchase_amount` (`purchase_amount`),
  KEY `idx_dormant_purchase_age` (`dormant`,`purchase_amount`,`age`),
  KEY `idx_dormant_age_purchase` (`dormant`,`age`,`purchase_amount`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

 

 
전체 회원 수 500만명 / 휴면 회원 수 250만명
 
age 값은 20~80 랜덤 고르게 분포함
 
 

 
purchase_amount = 총 누적 금액
 
전체 500만명 / 1원 이상 구매한 사람 350만 명
 
구하고자 하는 쿼리
휴먼이 아닌(dormant = N) 30대 이상 구매 회원 중 누적 구매 금액  max, min 

select max(purchase_amount), min(purchase_amount) from user use index(idx_dormant_purchase_age) 
where dormant = 'N' and purchase_amount > 0 and age >= 30;

select max(purchase_amount), min(purchase_amount) from user use index(idx_dormant_age_purchase) 
where dormant = 'N' and purchase_amount > 0 and age >= 30;

 
 

 

 
두 인덱스 모두 별 차이 없음
select가 max든 min 이든 별 차이 없음
실행계획도 다 똑같음
전부 1.5초 쯤 소요

// 1.5 초 걸림
select max(purchase_amount) from user use index(idx_dormant_purchase_age) 
where dormant = 'N' and purchase_amount > 0 and age >= 30;

// 1.4초 걸림
select min(purchase_amount) from user use index(idx_dormant_purchase_age) 
where dormant = 'N' and purchase_amount > 0 and age >= 30;

//1.5초 걸림
select min(purchase_amount) from user use index(idx_dormant_age_purchase) 
where dormant = 'N' and purchase_amount > 0 and age >= 30;

//1.6초 걸림
select max(purchase_amount) from user use index(idx_dormant_age_purchase) 
where dormant = 'N' and purchase_amount > 0 and age >= 30;

 

 
 
max, min 값 구하기
목표는 0.1초 근처로 조회 속도 개선하기
 
조건1) 캐싱 및 사전 계산 금지
 
조건2) 어플리케이션 단에서 연산 금지
 
조건3) 꼭 한번에 max, min 가져올 필요는 없음 나눠서 가져와도 됨
어차피 API 응답 결과에만 합쳐주면 되니깐