Skip to content

Latest commit

ย 

History

History
163 lines (114 loc) ยท 7.26 KB

File metadata and controls

163 lines (114 loc) ยท 7.26 KB

์กฐํšŒ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ธฐ๋Šฅ ์‹๋ณ„

  1. 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. ๋ฐฉ๋ฒ•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;
  • ์‹คํ–‰ ๊ฒฐ๊ณผ Order.orderedAt

  • ์‹คํ–‰ ๊ณ„ํš ์š”์•ฝ

    table type possible_keys key key_len rows filtered Extra
    o range PRIMARY,idx_order_ordered_at idx_order_ordered_at 9 3000 100.0 Using where; Using index; Using temporary; Using filesort
    oi ref FKs234mi6jususbx4b37k44cipy,
    FK551losx9j75ss5d6bfsqvijna,
    idx_order_item_ordered_product
    FKs234mi6jususbx4b37k44cipy 9 2 100.0 NULL
  • ์žฅ์ : ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๋ฉฐ, ์ •๊ทœํ™” ๋ชจ๋ธ์— ์ ํ•ฉ

  • ๋‹จ์ : ์กฐ์ธ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์กฐ์ธ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ Grouping/์ •๋ ฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”/์ •๋ ฌ ๋น„์šฉ์ด ํผ

  1. ๋ฐฉ๋ฒ•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;
  • ์‹คํ–‰ ๊ฒฐ๊ณผ OrderItem.orderedAt

  • ์‹คํ–‰ ๊ณ„ํš ์š”์•ฝ

    table type possible_keys key key_len rows filtered Extra
    oi index FK551losx9j75ss5d6bfsqvijna,
    idx_order_item_ordered_at
    FK551losx9j75ss5d6bfsqvijna 8 20230 29.66 Using where; Using temporary; Using filesort
  • ์žฅ์ : ์กฐ์ธ์„ ์ œ๊ฑฐํ•˜์—ฌ ๋‹จ์ˆœํ™”๋œ ์ฟผ๋ฆฌ, ๋ถˆํ•„์š”ํ•œ Join ์ œ๊ฑฐ

  • ๋‹จ์ : ordered_at๋งŒ ํ•„ํ„ฐ๋งํ•˜์—ฌ product_id ๊ทธ๋ฃนํ•‘/์ •๋ ฌ์€ ์—ฌ์ „ํžˆ ๋น„์šฉ ๋ฐœ์ƒ

  1. ๋ฐฉ๋ฒ•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);
  • ์‹คํ–‰ ๊ฒฐ๊ณผ OrderItem.orderedAt.productId

  • ์‹คํ–‰ ๊ณ„ํš ์š”์•ฝ

    table type possible_keys key key_len rows filtered Extra
    oi index FK551losx9j75ss5d6bfsqvijna,
    idx_order_item_ordered_product
    FK551losx9j75ss5d6bfsqvijna 8 20230 50.0 Using where; Using temporary; Using filesort
  • ์žฅ์ :

    • ordered_at ๋ฒ”์œ„ ํ•„ํ„ฐ๋ง์„ ์œ„ํ•ด ์ธ๋ฑ์Šค range scan ๊ฐ€๋Šฅ
    • ๊ฐ™์€ ์ธ๋ฑ์Šค๋กœ product_id๋„ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋‹จ์ :

    • Group By/Order By๊ฐ€ ์—ฌ์ „ํžˆ ์ธ๋ฑ์Šค ์ปฌ๋Ÿผ ์™ธ์˜ ์—ฐ์‚ฐ์œผ๋กœ filesort ๋ฐœ์ƒ

3-2. (product_id, ordered_at) ์ˆœ์„œ

CREATE INDEX idx_order_item_ordered_product ON order_item (product_id, ordered_at);
# ProductId FK์™€ ๋ณ‘ํ•ฉ๋จ
  • ์‹คํ–‰ ๊ฒฐ๊ณผ OrderItem.productId.orderedAt

  • ์‹คํ–‰ ๊ณ„ํš ์š”์•ฝ

    table type possible_keys key key_len rows filtered 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๋ฐฐ ์ •๋„ ํ™•์žฅํ•˜์—ฌ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ