- 3์ผ ์ด๋ด ์ฃผ๋ฌธ ๊ธฐ์ค์ผ๋ก ์ํ๋ณ ํ๋งค๋ TOP 5๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ์ ๋ํด, ๋ค์ ์ธ ๊ฐ์ง ๋ฐฉ์์ ์ธ๋ฑ์ค ์ฌ์ฉ ์ฑ๋ฅ์ ๋น๊ตํ๋ค.
- ๋ฐฉ๋ฒ 1: Order.orderedAt ํํฐ + ์กฐ์ธ
- ๋ฐฉ๋ฒ 2: OrderItem.orderedAt ๋จ๋ ํํฐ
- ๋ฐฉ๋ฒ 3-1: ๋ณตํฉ ์ธ๋ฑ์ค (orderedAt, productId)
- ๋ฐฉ๋ฒ 3-2: ๋ณตํฉ ์ธ๋ฑ์ค (productId, orderedAt)
User: 100๋ชProduct: 100๊ฐOrder: 10,000๊ฑดOrderItem: 20,000๊ฑด
docker exec -i hhplus-mysql mysql -u application -p******* hhplus < ./dummy/insert_users.sql
docker exec -i hhplus-mysql mysql -u application -p******* hhplus < ./dummy/insert_products.sql
docker exec -i hhplus-mysql mysql -u application -p******* hhplus < ./dummy/insert_orders.sql
docker exec -i hhplus-mysql mysql -u application -p******* hhplus < ./dummy/insert_order_items.sql
- ๋ฐฉ๋ฒ1: Order ๊ธฐ์ค Join ๋ฐฉ์
EXPLAIN
SELECT oi.product_id, SUM(oi.quantity) AS total_quantity
FROM `order` o
JOIN order_item oi ON o.id = oi.order_id
WHERE o.ordered_at >= NOW() - INTERVAL 3 DAY
GROUP BY oi.product_id
ORDER BY total_quantity DESC
LIMIT 5;-
์คํ ๊ณํ ์์ฝ
table type possible_keys key key_len rows filtered Extra orange PRIMARY,idx_order_ordered_at idx_order_ordered_at 9 3000 100.0 Using where; Using index; Using temporary; Using filesort oiref FKs234mi6jususbx4b37k44cipy,
FK551losx9j75ss5d6bfsqvijna,
idx_order_item_ordered_productFKs234mi6jususbx4b37k44cipy 9 2 100.0 NULL -
์ฅ์ : ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ช ํํ๋ฉฐ, ์ ๊ทํ ๋ชจ๋ธ์ ์ ํฉ
-
๋จ์ : ์กฐ์ธ ๋น์ฉ์ด ๋ฐ์ํ๋ฉฐ, ์กฐ์ธ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ Grouping/์ ๋ ฌํด์ผ ํ๋ฏ๋ก ์์ ํ ์ด๋ธ/์ ๋ ฌ ๋น์ฉ์ด ํผ
- ๋ฐฉ๋ฒ2: OrderItem ์ญ์ ๊ทํ ํ๋ ๋จ๋ ์กฐํ ๋ฐฉ์
CREATE INDEX idx_order_item_ordered_at ON order_item (ordered_at);
EXPLAIN
SELECT oi.product_id, SUM(oi.quantity) AS total_quantity
FROM order_item oi
WHERE oi.ordered_at >= NOW() - INTERVAL 3 DAY
GROUP BY oi.product_id
ORDER BY total_quantity DESC
LIMIT 5;-
์คํ ๊ณํ ์์ฝ
table type possible_keys key key_len rowsfiltered Extra oi index FK551losx9j75ss5d6bfsqvijna,
idx_order_item_ordered_atFK551losx9j75ss5d6bfsqvijna 8 20230 29.66 Using where; Using temporary; Using filesort -
์ฅ์ : ์กฐ์ธ์ ์ ๊ฑฐํ์ฌ ๋จ์ํ๋ ์ฟผ๋ฆฌ, ๋ถํ์ํ Join ์ ๊ฑฐ
-
๋จ์ : ordered_at๋ง ํํฐ๋งํ์ฌ product_id ๊ทธ๋ฃนํ/์ ๋ ฌ์ ์ฌ์ ํ ๋น์ฉ ๋ฐ์
- ๋ฐฉ๋ฒ3: ์ธ๋ฑ์ค ์์๋ณ ๋น๊ต
EXPLAIN
SELECT oi.product_id, SUM(oi.quantity) AS total_quantity
FROM order_item oi
WHERE oi.ordered_at >= NOW() - INTERVAL 3 DAY
GROUP BY oi.product_id
ORDER BY total_quantity DESC
LIMIT 5;3-1. (ordered_at, product_id) ์์
CREATE INDEX idx_order_item_ordered_product ON order_item (ordered_at, product_id);-
์คํ ๊ณํ ์์ฝ
table type possible_keys key key_len rowsfiltered Extra oi index FK551losx9j75ss5d6bfsqvijna,
idx_order_item_ordered_productFK551losx9j75ss5d6bfsqvijna 8 20230 50.0 Using where; Using temporary; Using filesort -
์ฅ์ :
- ordered_at ๋ฒ์ ํํฐ๋ง์ ์ํด ์ธ๋ฑ์ค range scan ๊ฐ๋ฅ
- ๊ฐ์ ์ธ๋ฑ์ค๋ก product_id๋ ๋น ๋ฅด๊ฒ ์ ๊ทผ ๊ฐ๋ฅ
-
๋จ์ :
- Group By/Order By๊ฐ ์ฌ์ ํ ์ธ๋ฑ์ค ์ปฌ๋ผ ์ธ์ ์ฐ์ฐ์ผ๋ก
filesort๋ฐ์
- Group By/Order By๊ฐ ์ฌ์ ํ ์ธ๋ฑ์ค ์ปฌ๋ผ ์ธ์ ์ฐ์ฐ์ผ๋ก
3-2. (product_id, ordered_at) ์์
CREATE INDEX idx_order_item_ordered_product ON order_item (product_id, ordered_at);
# ProductId FK์ ๋ณํฉ๋จ-
์คํ ๊ณํ ์์ฝ
table type possible_keys key key_len rowsfiltered Extra oi index idx_order_item_ordered_product idx_order_item_ordered_product 17 20230 33.33 Using where; Using temporary; Using filesort -
์ฅ์ :
- Group By ๋์์ธ product_id๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฏ๋ก ๊ทธ๋ฃนํ์ ์ ๋ฆฌ
-
๋จ์ :
- ํํฐ ์กฐ๊ฑด์ธ ordered_at์ด ํ์์์ฌ์ range scan ๋ถ๊ฐ, ์ ๋ฒ์ ์ค์บ ๋ฐ์
| ๋น๊ต ํญ๋ชฉ | ๋ฐฉ์ 1 (Join) | ๋ฐฉ์ 2 (๋จ๋ ํํฐ) | 3-1 (orderedAt, productId) | 3-2 (productId, orderedAt) |
|---|---|---|---|---|
| ์กฐ์ธ ๋น์ฉ | O | X | X | X |
| ์ธ๋ฑ์ค ๋ฒ์ ํํฐ๋ง ๊ฐ๋ฅ | O | O | O | X |
| Group By ์ต์ ํ ๊ฐ๋ฅ | ์ ํ์ | ์ ํ์ | ์ ํ์ | ์ผ๋ถ ๊ฐ๋ฅ |
| filesort ๋ฐ์ ์ฌ๋ถ | ์์ | ์์ | ์์ | ์์ |
| ์ต์ข ์ฑ๋ฅ | ๋ณดํต | ์ฝ๊ฐ ๊ฐ์ | ๊ฐ์ฅ ์์ ์ | ๋น๊ต์ ๋นํจ์จ |
-
์กฐ์ธ ์ ๊ฑฐ + ๋ณตํฉ ์ธ๋ฑ์ค ์ฌ์ฉ(3-1) ์กฐํฉ์ด ๊ฐ์ฅ ์ ์ ํจ
- WHERE ordered_at ํํฐ์ ํจ์จ์
- GROUP BY product_id๊ฐ ์ธ๋ฑ์ค ์ปค๋ฒ๋ฆฌ์ง ๋ด์ ์กด์ฌ
-
๋ณตํฉ ์ธ๋ฑ์ค ์์ฑ ์ ์์๊ฐ ๋งค์ฐ ์ค์
- ํํฐ ์กฐ๊ฑด(
ordered_at)์ ํญ์ ์ธ๋ฑ์ค ์์ชฝ์ ๋ฐฐ์นํด์ผ ํจ์จ์ ์ธ range scan์ด ๊ฐ๋ฅํจ
- ํํฐ ์กฐ๊ฑด(
- 3์ผ, 5๊ฐ ๊ณ ์ ๊ฐ์ ์ ๊ฑฐ ํ๊ณ , ์ฌ์ฉ์ ์์ฒญ์ฌํญ์ ์ถฉ์กฑํ๋ ์ถ๊ฐ ํต๊ณ ์งํ์ ๋ํ ํ ์คํธ ์ํ
- ๋๋ฏธ๋ฐ์ดํฐ๋ฅผ 100๋ฐฐ ์ ๋ ํ์ฅํ์ฌ ์ถ๊ฐ ํ ์คํธ



