카테고리 없음
오늘의 문제는 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 응답 결과에만 합쳐주면 되니깐