카테고리 없음

주문 목록 조회 SQL 튜닝

gw1 2026. 2. 8. 18:19

MySQL innoDB 8.0기준

다른 DB는 결과가 다를 수 있음

CREATE TABLE `orders` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL,
  `order_status` varchar(30) NOT NULL DEFAULT 'CREATED',
  `order_date` datetime DEFAULT NULL,
  `price` bigint DEFAULT '0',
  `amount` bigint DEFAULT '0',
  `sum_price` bigint GENERATED ALWAYS AS ((`price` * `amount`)) STORED,
  PRIMARY KEY (`id`),
  KEY `order_date` (`order_date`),
  KEY `sum_price` (`sum_price`)
) ENGINE=InnoDB AUTO_INCREMENT=8388611 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

 
sum_price STORED는 곱셈 결과를 자동으로 계산 해주는 값이라 딱히 신경 안써도 됩니다.

 
전체 데이터 분포는 2025년 데이터만 있고 
총 838만개 입니다.
 

 
총 한달 치 데이터는 71만개
 
구하고자 하는 쿼리

SELECT
    *
FROM
    test.orders
WHERE
    order_date BETWEEN '2025-03-01 00:00:00'
                  AND '2025-03-31 23:59:59'
ORDER BY
    sum_price DESC,
    id
LIMIT
    10, 10;

 
한달치 범위에서 합계 금액 내림차순으로 페이징으로 가져옵니다.
단, 합계 금액이 중복 값이 많아 정렬이 꼬일 수 있어 PK인 id로 2차 추가 정렬합니다.
 

 
쿼리 실행 시 26~27초가 걸리고 ALL로 풀스캔합니다.
 
현재 테이블에 생성된 인덱스는 아래 2개 입니다.

  KEY `order_date` (`order_date`),
  KEY `sum_price` (`sum_price`)

 
 
조회가 느린 해당 문제를 해결하세요.

1. 인덱스 추가 없이 해결하는 방법
2. 인덱스 추가로 해결하는 방법

을 제시하세요.

 

두개 다 맞춰야 정답으로 인정