1. 준비 : 세션 시간 늘리기 및 더미

1-1) 세션 시간늘리기 (edit - preferences)

image.png

1-2) 더미

CREATE DATABASE IF NOT EXISTS idx_lab
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_0900_ai_ci;

USE idx_lab;

DROP TABLE IF EXISTS orders_big;

CREATE TABLE orders_big (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  customer_id BIGINT NOT NULL,
  status ENUM('complete','cancel') NOT NULL,
  total_amount INT NOT NULL,
  ordered_at DATETIME NOT NULL,
  city VARCHAR(30) NOT NULL,
  memo VARCHAR(100) NOT NULL
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4;

SET SESSION cte_max_recursion_depth = 600000;

INSERT INTO orders_big (customer_id, status, total_amount, ordered_at, city, memo)
WITH RECURSIVE seq AS (
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1 FROM seq WHERE n < 500000
)
SELECT
  (n % 100000) + 1 AS customer_id,                        -- 고객 10만명
  IF(n % 10 = 0, 'cancel', 'complete') AS status,         -- cancel 10%
  (n % 200000) + 1000 AS total_amount,                    -- 1,000 ~ 200,999
  DATE_SUB(NOW(), INTERVAL (n % 365) DAY)                 -- 최근 1년
    + INTERVAL (n % 86400) SECOND AS ordered_at,
  ELT((n % 10) + 1, 'Seoul','Busan','Incheon','Daegu','Daejeon','Gwangju','Ulsan','Suwon','Sejong','Jeju') AS city,
  CONCAT('memo-', LPAD((n % 100000), 5, '0')) AS memo     -- memo-00000 ~ memo-99999 반복
FROM seq;

ANALYZE TABLE orders_big;
-- 배치로 수십만~수백만 건 넣은 직후
-- 인덱스 새로 만든 직후
-- 쿼리 튜닝 들어가기 직전

<aside> 💡

WITH RECURSIVE 한 줄 정의

WITH RECURSIVE는 SQL 안에서 “자기 자신을 반복 호출하는 임시 결과 집합”을 만드는 문법이다.

➡️ 쉽게 말해

“SQL로 for문 / while문 만드는 것” 이라고 생각하면 된다.

</aside>

실습 : 기본 인덱스 1개 “있을 때 vs 없을 때” 비교

2-1) 인덱스 없이 실행

EXPLAIN ANALYZE
SELECT*
FROM orders_big
WHERE customer_id=77777;

결과에 대한 분석

2-2) 단일 인덱스 생성

CREATE INDEX idx_customer ON orders_big (customer_id);

ANALYZE TABLE orders_big;

2-3) 인덱스 있고 실행

EXPLAIN ANALYZE
SELECT*
FROM orders_big
WHERE customer_id=77777;

결과확인 분석

✅ 체감 포인트