
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>
EXPLAIN ANALYZE
SELECT*
FROM orders_big
WHERE customer_id=77777;
CREATE INDEX idx_customer ON orders_big (customer_id);
ANALYZE TABLE orders_big;
EXPLAIN ANALYZE
SELECT*
FROM orders_big
WHERE customer_id=77777;
✅ 체감 포인트