쿼리 튜닝

distinct한 값을 빠르게 뽑기 문제

gw1 2025. 11. 30. 22:51
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `grade` varchar(20) DEFAULT '1',
  `deleted` char(1) NOT NULL DEFAULT 'N',
  PRIMARY KEY (`id`),
  KEY `name` (`name`),
  KEY `phone` (`phone`),
  KEY `idx_grade` (`grade`)
) ENGINE=InnoDB AUTO_INCREMENT=12721043 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

 
데이터는 1200만건으로 많습니다.

select distinct grade from user where deleted = 'N';

 
deleted = 'Y' 삭제된건 빼고 grade 값의 목록을 가져오려고 합니다.
 
그 결과를 아래처럼 유저 목록에 셀렉션 박스 형태로 들어간다고 보시면 됩니다.
 

 
 
grade 값만 모아두는 grade 테이블을 두는게 더 낫고,
 
저렇게 유니크 값 목록을 쿼리로 뽑는게 좋은 방식은 아니지만,
 
튜닝 연습 목적으로 개선해보세요. 

 

 
로딩 시간 20초 가량 소요
 
1. 인덱스 구성 변경 불가
 
2. 백엔드 쪽 어플리케이션 소스 및 쿼리만 변경 가능

3. 삭제된 경우, deleted = 'Y'는 데이터는 조회가 안되어야 정상임

grade 경우의 수는 사전에 알 수 없지만
100건 이하로 적다고 합시다.