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건 이하로 적다고 합시다.
'쿼리 튜닝' 카테고리의 다른 글
| 휴먼 회원 조회 문제 (0) | 2025.12.12 |
|---|---|
| JOIN+Range Scan 충돌 문제 (0) | 2025.10.21 |
| OOM(Out of Memeory) 문제 (5) | 2025.10.05 |
| 2차 정렬로 인한 문제 (0) | 2025.09.27 |
| 최근 접속자 목록 조회 문제 (0) | 2025.08.20 |