๐Ÿš€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹: ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ๋์€ ์–ด๋””์ผ๊นŒ? ๐Ÿ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹: ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ๋์€ ์–ด๋””์ผ๊นŒ? ๐Ÿ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด์š”. ๋ฐ”๋กœ "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹"๊ณผ "์ฟผ๋ฆฌ ์ตœ์ ํ™”"์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ์ฃผ์ œ, ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์ข€ ๋”ฑ๋”ฑํ•˜๊ณ  ์ง€๋ฃจํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์ œ๊ฐ€ ์žฌ๋ฏธ์žˆ๊ฒŒ ํ’€์–ด๋ณผ๊ฒŒ์š”! ใ…‹ใ…‹ใ…‹

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ญ”์ง€ ์•„์‹œ๋‚˜์š”? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์—„์ฒญ๋‚˜๊ฒŒ ํฐ ๋””์ง€ํ„ธ ์ฐฝ๊ณ ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”. ์ด ์ฐฝ๊ณ ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋˜์–ด ์žˆ์ฃ . ๊ทผ๋ฐ ๋ฌธ์ œ๋Š” ์ด ์ฐฝ๊ณ ๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ์›ํ•˜๋Š” ๋ฌผ๊ฑด์„ ์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”. ์—ฌ๊ธฐ์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ "์ฟผ๋ฆฌ ์ตœ์ ํ™”"๋ž๋‹ˆ๋‹ค! ๐Ÿ•ต๏ธโ€โ™€๏ธ

์ฟผ๋ฆฌ ์ตœ์ ํ™”๋Š” ๋งˆ์น˜ ์ด ๊ฑฐ๋Œ€ํ•œ ์ฐฝ๊ณ ์—์„œ ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฌผ๊ฑด์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ๊ตฌํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ๊ฐ€ ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋น ๋ฅด๊ฒŒ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ๋‹ค ์ด๋Ÿฐ ์ตœ์ ํ™” ๋•๋ถ„์ด์—์š”!

๐Ÿค” ๊ถ๊ธˆํ•ด์š”! ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์ด ์™œ ์ค‘์š”ํ• ๊นŒ์š”?

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ: ๋น ๋ฅธ ์‘๋‹ต ์‹œ๊ฐ„ = ํ–‰๋ณตํ•œ ์‚ฌ์šฉ์ž ๐Ÿ˜Š
  • ์„œ๋ฒ„ ์ž์› ์ ˆ์•ฝ: ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ = ๋น„์šฉ ์ ˆ๊ฐ ๐Ÿ’ฐ
  • ํ™•์žฅ์„ฑ ๊ฐœ์„ : ์ตœ์ ํ™”๋œ DB = ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž ์ˆ˜์šฉ ๊ฐ€๋Šฅ ๐Ÿš€

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ๊ณ ๊ณ ์”ฝ~! ๐Ÿƒโ€โ™‚๏ธ๐Ÿ’จ

๐Ÿ“Š ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์˜ ๊ธฐ์ดˆ: ์™œ ํ•„์š”ํ• ๊นŒ์š”?

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ๋Š๋ฆฐ ์›น์‚ฌ์ดํŠธ๋‚˜ ์•ฑ์„ ์‚ฌ์šฉํ•ด๋ณธ ์  ์žˆ๋‚˜์š”? ์งœ์ฆ ๋‚˜์ฃ , ๊ทธ์ตธ? ใ…‹ใ…‹ใ…‹ ๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์ด๋Ÿฐ ๋Š๋ฆฐ ๋ฐ˜์‘ ์†๋„์˜ ์ฃผ๋ฒ”์ด ๋ฐ”๋กœ ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ผ ์ˆ˜ ์žˆ์–ด์š”!

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์€ ๋งˆ์น˜ ์ž๋™์ฐจ ์—”์ง„์„ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ๋” ๋น ๋ฅด๊ณ , ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฑฐ์ฃ !

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์‚ฌ"๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค๊ณ  ํ•ด๋ด์š”. ์ด ๊ฐ„๋‹จํ•œ ๊ฒ€์ƒ‰์ด ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์ ์ ˆํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์•„๋‚ด์•ผ ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ตœ์ ํ™”๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด, ์ด ๊ฒ€์ƒ‰์— ๋ช‡ ์ดˆ, ์‹ฌ์ง€์–ด ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ์–ด์š”! ๐Ÿ˜ฑ

๐Ÿ’ก ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?

Amazon.com์˜ ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด, ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด 100ms๋งŒ ๋Š˜์–ด๋‚˜๋„ ๋งค์ถœ์ด 1% ๊ฐ์†Œํ•œ๋‹ค๊ณ  ํ•ด์š”. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ์ด ๋น„์ฆˆ๋‹ˆ์Šค์— ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ์ฃ !

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํŠœ๋‹ํ•ด์•ผ ํ•ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ์‹œ์ž‘์ ์ด์—์š”. ์ฟผ๋ฆฌ๋ž€ ๋ญ๋ƒ๊ณ ์š”? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ด๋Š” "์š”์ฒญ"์ด์—์š”. "์•ผ, DB์•ผ! ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์‚ฌ ์ข€ ์ฐพ์•„์ค˜!"๋ผ๊ณ  ํ•˜๋Š” ๊ฑฐ์ฃ . ใ…‹ใ…‹ใ…‹

์ฟผ๋ฆฌ ์ตœ์ ํ™”๋Š” ์ด "์š”์ฒญ"์„ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด์—์š”. ๋งˆ์น˜ ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜์ด ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ๋ฐฐ๋ฅผ ๋ฐฐ๋‹ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”!

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹ ๋น„๊ต ํŠœ๋‹ ์ „ ํŠœ๋‹ ํ›„ ๋Š๋ฆฐ ์ฟผ๋ฆฌ ๋น ๋ฅธ ์ฟผ๋ฆฌ

์ด ๊ทธ๋ฆผ์„ ๋ณด์„ธ์š”. ์™ผ์ชฝ์€ ํŠœ๋‹ ์ „์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์š”. ํฐ ์›์€ ๋Š๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃ . ์˜ค๋ฅธ์ชฝ์€ ํŠœ๋‹ ํ›„์˜ ๋ชจ์Šต์ด์—์š”. ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์ž‘๊ณ  ๋นจ๋ผ์กŒ์ฃ ? ์ด๊ฒŒ ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์ด ์™œ ์ค‘์š”ํ•œ์ง€ ๊ฐ์ด ์˜ค์‹œ๋‚˜์š”? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์žฌ๋ฏธ์žˆ์„ ๊ฑฐ์˜ˆ์š”, ๊ธฐ๋Œ€ํ•˜์„ธ์š”! ๐Ÿ˜‰

๐Ÿ” ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ๊ธฐ๋ณธ ์›์น™

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ์„ธ๊ณ„๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์–ด๋ ค์šด ์šฉ์–ด๋Š” ์ตœ๋Œ€ํ•œ ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๋งˆ์น˜ ์นœ๊ตฌ์™€ ์ˆ˜๋‹ค ๋– ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ใ…‹ใ…‹ใ…‹

์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ์ฒซ ๋ฒˆ์งธ ์›์น™์€ ๋ฐ”๋กœ "ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ"์˜ˆ์š”.

์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๊ณ ์š”? ์Œ... ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ํŽธ์˜์ ์— ์šฐ์œ ๋ฅผ ์‚ฌ๋Ÿฌ ๊ฐ”๋‹ค๊ณ  ํ•ด๋ด์š”. ๊ทผ๋ฐ ์šฐ์œ ๋งŒ ์‚ฌ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฐ€๊ฒŒ ์•ˆ์˜ ๋ชจ๋“  ๋ฌผ๊ฑด์„ ๋‹ค ์ง‘์–ด ๋“ค๊ณ  ๊ณ„์‚ฐ๋Œ€๋กœ ๊ฐ€๋ฉด ์–ด๋–จ๊นŒ์š”? ๋ฏธ์นœ ์ง“์ด๊ฒ ์ฃ ? ใ…‹ใ…‹ใ…‹

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ •ํ™•ํ•˜๊ฒŒ ์š”์ฒญํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ์ด๊ฑธ SQL์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•ด์š”:


-- ๋‚˜์œ ์˜ˆ
SELECT * FROM users;

-- ์ข‹์€ ์˜ˆ
SELECT name, email FROM users WHERE active = true;

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ค ๊ฐ€์ ธ์˜ค๋Š” ๊ฑฐ์˜ˆ์š”. ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ํ•„์š”ํ•œ ์ •๋ณด(์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ)๋งŒ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฒŒ๋‹ค๊ฐ€ ํ™œ์„ฑ ์‚ฌ์šฉ์ž๋งŒ ์„ ํƒํ•˜๊ณ  ์žˆ์ฃ . ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ฒ ์ฃ ?

๐ŸŒŸ ๊ฟ€ํŒ!

SELECT * ๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•˜์„ธ์š”. ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ์ข‹๋‹ต๋‹ˆ๋‹ค!

๋‘ ๋ฒˆ์งธ ์›์น™์€ "์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๊ธฐ"์˜ˆ์š”. ์ธ๋ฑ์Šค๊ฐ€ ๋ญ๋ƒ๊ณ ์š”? ์ฑ…์˜ ๋ชฉ์ฐจ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”!

์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ •๋ณด๋ฅผ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํŠน๋ณ„ํ•œ ๊ตฌ์กฐ์˜ˆ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์—์„œ "ํ”„๋กœ๊ทธ๋ž˜๋ฐ" ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋ชจ๋“  ๊ฐ•์˜๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ํ•ด๋ด์š”. ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ชจ๋“  ๊ฐ•์˜๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ํ™•์ธํ•ด์•ผ ํ•ด์š”. ๊ทผ๋ฐ "์นดํ…Œ๊ณ ๋ฆฌ"์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด? ํ›จ์”ฌ ๋นจ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ !


-- ์ธ๋ฑ์Šค ์ƒ์„ฑ ์˜ˆ์‹œ
CREATE INDEX idx_category ON courses(category);

-- ์ด์ œ ์ด๋Ÿฐ ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์งˆ ๊ฑฐ์˜ˆ์š”
SELECT * FROM courses WHERE category = 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ';

ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•˜์„ธ์š”! ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ์ข‹์€ ๊ฑด ์•„๋‹ˆ์—์š”. ์ธ๋ฑ์Šค๋„ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ž…๋ ฅ/์ˆ˜์ •/์‚ญ์ œ ์‹œ ์ถ”๊ฐ€ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ฑฐ๋“ ์š”. ๋งˆ์น˜ ์ฑ…์˜ ๋ชฉ์ฐจ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”!

์ธ๋ฑ์Šค์˜ ํšจ๊ณผ ์ธ๋ฑ์Šค์˜ ํšจ๊ณผ ๋ฐ์ดํ„ฐ ์–‘ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„ ์ธ๋ฑ์Šค ์—†์Œ ์ธ๋ฑ์Šค ์žˆ์Œ

์ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์„ธ์š”. ๋นจ๊ฐ„ ์„ ์€ ์ธ๋ฑ์Šค ์—†์ด ๊ฒ€์ƒ‰ํ•  ๋•Œ์˜ ์‹œ๊ฐ„์ด์—์š”. ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜์ฃ . ๋ฐ˜๋ฉด ์ดˆ๋ก ์„ ์€ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ˆ์š”. ๋ฐ์ดํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•„์š”. coolํ•˜์ฃ ? ๐Ÿ˜Ž

์„ธ ๋ฒˆ์งธ ์›์น™์€ "์กฐ์ธ(JOIN)์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ"์˜ˆ์š”. ์กฐ์ธ์€ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์น˜๋Š” ์ž‘์—…์ด์—์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ์ž˜๋ชป๋˜๋ฉด ์„ฑ๋Šฅ์— ์—„์ฒญ๋‚œ ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”!

๋ณต์žกํ•œ ์กฐ์ธ์€ ๋งˆ์น˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํผ์ฆ์„ ํ•œ ๋ฒˆ์— ๋งž์ถ”๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์–ด๋ ต๊ณ  ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ฃ !

์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์—์„œ ํŠน์ • ๊ฐ•์‚ฌ์˜ ๋ชจ๋“  ๊ฐ•์˜์™€ ์ˆ˜๊ฐ•์ƒ ์ •๋ณด๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”:


SELECT c.title, u.name
FROM courses c
JOIN enrollments e ON c.id = e.course_id
JOIN users u ON e.user_id = u.id
WHERE c.instructor_id = 123;

์ด ์ฟผ๋ฆฌ๋Š” ์„ธ ๊ฐœ์˜ ํ…Œ์ด๋ธ”(courses, enrollments, users)์„ ์กฐ์ธํ•˜๊ณ  ์žˆ์–ด์š”. ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ด๋Ÿฐ ์ฟผ๋ฆฌ๋Š” ์—„์ฒญ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ๊ฐ€๋Šฅํ•˜๋ฉด ์กฐ์ธ์„ ์ค„์ด๊ณ , ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”.

โš ๏ธ ์ฃผ์˜!

๋„ˆ๋ฌด ๋งŽ์€ ํ…Œ์ด๋ธ”์„ ํ•œ ๋ฒˆ์— ์กฐ์ธํ•˜๋ฉด ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๊ฐ€๋Šฅํ•˜๋ฉด 3-4๊ฐœ ์ดํ•˜๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ต๋‹ˆ๋‹ค!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ๊ธฐ๋ณธ ์›์น™์ด์—์š”. ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ๋ณ„๊ฑฐ ์•„๋‹ˆ์ฃ ? ใ…‹ใ…‹ใ…‹ ํ•˜์ง€๋งŒ ์ด ๊ฐ„๋‹จํ•œ ์›์น™๋“ค๋งŒ ์ž˜ ์ง€์ผœ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ์ด ํ™• ์ข‹์•„์งˆ ๊ฑฐ์˜ˆ์š”!

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด๋Ÿฐ ์›์น™๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋” ๊ณ ๊ธ‰ ๊ธฐ์ˆ ๋“ค์€ ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ์ €๋Š” ๋„ˆ๋ฌด ์‹ ๋‚˜์š”! ๐Ÿคฉ

๐Ÿ› ๏ธ ์‹ค์ „ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ํ…Œํฌ๋‹‰

์ž, ์ด์ œ ์ง„์งœ ์‹ค์ „์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„, ๊ธด์žฅํ•˜์…จ๋‚˜์š”? ๊ดœ์ฐฎ์•„์š”, ์ œ๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๋งˆ์น˜ ๋ง›์žˆ๋Š” ๋ ˆ์‹œํ”ผ๋ฅผ ์•Œ๋ ค์ฃผ๋“ฏ์ด์š”! ๐Ÿ˜‹

์ฒซ ๋ฒˆ์งธ ํ…Œํฌ๋‹‰: ์„œ๋ธŒ์ฟผ๋ฆฌ ์ตœ์ ํ™”ํ•˜๊ธฐ

์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€ ๋ญ˜๊นŒ์š”? ์ฟผ๋ฆฌ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์ธ์…‰์…˜ ์˜ํ™”์ฒ˜๋Ÿผ ๊ฟˆ ์†์˜ ๊ฟˆ์ด์ฃ ! ใ…‹ใ…‹ใ…‹ ๊ทผ๋ฐ ์ด ์„œ๋ธŒ์ฟผ๋ฆฌ, ์ž˜๋ชป ์“ฐ๋ฉด ์„ฑ๋Šฅ์„ ์—„์ฒญ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๊ฐ•์˜๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ํ•ด๋ด์š”:


-- ๋น„ํšจ์œจ์ ์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ
SELECT title
FROM courses
WHERE id = (
    SELECT course_id
    FROM enrollments
    GROUP BY course_id
    ORDER BY COUNT(*) DESC
    LIMIT 1
);

-- ์ตœ์ ํ™”๋œ ๋ฒ„์ „
SELECT c.title
FROM courses c
JOIN (
    SELECT course_id, COUNT(*) as enrollment_count
    FROM enrollments
    GROUP BY course_id
    ORDER BY enrollment_count DESC
    LIMIT 1
) e ON c.id = e.course_id;

๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๊ฐ€ ๋” ํšจ์œจ์ ์ด์—์š”. ์™œ๋ƒ๊ณ ์š”? ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ ์ฟผ๋ฆฌ์™€ ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ๊ฐ ๋”ฐ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋“ ์š”!

๐Ÿ’ก ๊ฟ€ํŒ!

๊ฐ€๋Šฅํ•˜๋ฉด ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์กฐ์ธ์ด ๋” ๋น ๋ฅด๋‹ต๋‹ˆ๋‹ค!

๋‘ ๋ฒˆ์งธ ํ…Œํฌ๋‹‰: ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ตœ์ ํ™”ํ•˜๊ธฐ

ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ๋ญ๋ƒ๊ณ ์š”? ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆ„๋Š” ๊ฑฐ์˜ˆ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ๊ฐ•์˜๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•œ ํŽ˜์ด์ง€์— ๋‹ค ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆ„์ž–์•„์š”? ๊ทธ๊ฒŒ ๋ฐ”๋กœ ํŽ˜์ด์ง€๋„ค์ด์…˜์ด์—์š”!

๊ทผ๋ฐ ์ด ํŽ˜์ด์ง€๋„ค์ด์…˜, ์ž˜๋ชปํ•˜๋ฉด ์—„์ฒญ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„ ๋•Œ์š”. ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?


-- ๋น„ํšจ์œจ์ ์ธ ํŽ˜์ด์ง€๋„ค์ด์…˜
SELECT *
FROM courses
ORDER BY created_at DESC
LIMIT 20 OFFSET 10000;

-- ์ตœ์ ํ™”๋œ ํŽ˜์ด์ง€๋„ค์ด์…˜
SELECT c.*
FROM courses c
JOIN (
    SELECT id
    FROM courses
    ORDER BY created_at DESC
    LIMIT 20 OFFSET 10000
) sub ON c.id = sub.id;

์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” 10,000๊ฐœ์˜ ํ–‰์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๊ทธ ๋‹ค์Œ 20๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€์š”. ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋ฉด ์ด๊ฒŒ ์—„์ฒญ ๋Š๋ ค์ ธ์š”. ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ๋Š” ๋จผ์ € ํ•„์š”ํ•œ ID๋งŒ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ๋‹ค์Œ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ธํ•ด์„œ ๊ฐ€์ ธ์˜ค์ฃ . ํ›จ์”ฌ ๋น ๋ฅด๋‹ต๋‹ˆ๋‹ค!

ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ตœ์ ํ™” ๋น„๊ต ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ตœ์ ํ™” ๋น„๊ต ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ ๋กœ๋”ฉ ์‹œ๊ฐ„ ์ตœ์ ํ™” ์ „ ์ตœ์ ํ™” ํ›„

์ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์„ธ์š”. ๋นจ๊ฐ„ ์„ ์€ ์ตœ์ ํ™” ์ „, ์ดˆ๋ก ์„ ์€ ์ตœ์ ํ™” ํ›„์˜ˆ์š”. ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์ตœ์ ํ™” ์ „ ์ฟผ๋ฆฌ๋Š” ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•˜์ง€๋งŒ, ์ตœ์ ํ™” ํ›„์—๋Š” ๊ฑฐ์˜ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋˜์ฃ . ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Ž

์„ธ ๋ฒˆ์งธ ํ…Œํฌ๋‹‰: ์ธ๋ฑ์Šค ํŠœ๋‹ํ•˜๊ธฐ

์•ž์„œ ์ธ๋ฑ์Šค๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ–ˆ์ฃ ? ๊ทผ๋ฐ ์ธ๋ฑ์Šค๋„ ์ž˜ ๋งŒ๋“ค์–ด์•ผ ํ•ด์š”. ๋ฌด์กฐ๊ฑด ๋งŽ์ด ๋งŒ๋“ ๋‹ค๊ณ  ์ข‹์€ ๊ฒŒ ์•„๋‹ˆ์—์š”!

์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž๋“ค์ด ์ฃผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ๊ฐ€๊ฒฉ์œผ๋กœ ๊ฐ•์˜๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค๊ณ  ํ•ด๋ด์š”. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”:


-- ๋ณตํ•ฉ ์ธ๋ฑ์Šค ์ƒ์„ฑ
CREATE INDEX idx_category_price ON courses(category, price);

-- ์ด์ œ ์ด๋Ÿฐ ์ฟผ๋ฆฌ๊ฐ€ ๋นจ๋ผ์งˆ ๊ฑฐ์˜ˆ์š”
SELECT * FROM courses WHERE category = 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ' AND price < 50000;

์ด๋ ‡๊ฒŒ ์ž์ฃผ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿผ๋“ค์„ ํ•˜๋‚˜์˜ ์ธ๋ฑ์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฑธ "๋ณตํ•ฉ ์ธ๋ฑ์Šค"๋ผ๊ณ  ํ•ด์š”. ์ด๊ฒŒ ๊ฐ๊ฐ ๋”ฐ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์–ด์š”!

๐Ÿšจ ์ฃผ์˜์‚ฌํ•ญ!

์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด INSERT, UPDATE, DELETE ์ž‘์—…์ด ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๊ผญ ํ•„์š”ํ•œ ์ธ๋ฑ์Šค๋งŒ ๋งŒ๋“ค์–ด์•ผ ํ•ด์š”!

๋„ค ๋ฒˆ์งธ ํ…Œํฌ๋‹‰: ์ฟผ๋ฆฌ ์บ์‹ฑ ํ™œ์šฉํ•˜๊ธฐ

์บ์‹ฑ์ด ๋ญ๋ƒ๊ณ ์š”? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ "๊ธฐ์–ตํ•ด๋‘๊ธฐ"์˜ˆ์š”. ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ๋‹ค์Œ์— ๊ฐ™์€ ์š”์ฒญ์ด ์˜ค๋ฉด ๋ฐ”๋กœ ์ฃผ๋Š” ๊ฑฐ์ฃ .

์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์˜ "์ด๋ฒˆ ์ฃผ ์ธ๊ธฐ ๊ฐ•์˜" ๋ชฉ๋ก์„ ์ƒ๊ฐํ•ด๋ด์š”. ์ด ๋ชฉ๋ก, ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ฒ ์ฃ ?


-- ์˜์‚ฌ ์ฝ”๋“œ (์‹ค์ œ SQL์ด ์•„๋‹™๋‹ˆ๋‹ค!)
IF (์บ์‹œ์— "์ด๋ฒˆ ์ฃผ ์ธ๊ธฐ ๊ฐ•์˜" ์žˆ์Œ AND ์บ์‹œ๊ฐ€ ์‹ ์„ ํ•จ) THEN
    ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
ELSE
    SQL๋กœ ์ƒˆ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ
    ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•˜๊ธฐ
END IF

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜๋„ ์ค„์ด๊ณ , ์‘๋‹ต ์†๋„๋„ ๋นจ๋ผ์ง€๊ณ ... ์ผ์„์ด์กฐ์ฃ ! ๐Ÿ‘

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์‹ค์ „ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ํ…Œํฌ๋‹‰์ด์—์š”. ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด๋Ÿฐ ํ…Œํฌ๋‹‰๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ดˆ๊ณ ์†์œผ๋กœ ๋ณ€์‹ ํ•  ๊ฑฐ์˜ˆ์š”! ๐Ÿš€

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด๋Ÿฐ ์ตœ์ ํ™”๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ธก์ •ํ•˜๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ธฐ๋Œ€๋˜์ง€ ์•Š๋‚˜์š”? ์ €๋Š” ๋„ˆ๋ฌด ์‹ ๋‚˜์š”! ๐Ÿ˜†

๐Ÿ“Š ์„ฑ๋Šฅ ์ธก์ •๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง: ์šฐ๋ฆฌ์˜ ๋…ธ๋ ฅ์ด ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์„๊นŒ?

์ž, ์—ฌ๋Ÿฌ๋ถ„! ์ง€๊ธˆ๊นŒ์ง€ ์—ด์‹ฌํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํŠœ๋‹ํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ–ˆ์–ด์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ์ •๋ง ํšจ๊ณผ๊ฐ€ ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ๋ƒฅ "๋Š๋‚Œ"์œผ๋กœ๋Š” ์•ˆ ๋˜๊ฒ ์ฃ ? ใ…‹ใ…‹ใ…‹ ์šฐ๋ฆฌ์—๊ฒ ๊ณผํ•™์ ์ธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ด์š”!

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„: ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„ํ•˜๊ธฐ

SQL์—๋Š” ์•„์ฃผ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์š”. ๋ฐ”๋กœ EXPLAIN์ด๋ผ๋Š” ๋ช…๋ น์–ด์˜ˆ์š”. ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•  ๊ณ„ํš์ธ์ง€ ์ž์„ธํžˆ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์š”๋ฆฌ์‚ฌ์˜ ๋ ˆ์‹œํ”ผ๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ฒƒ ๊ฐ™์ฃ !


EXPLAIN SELECT * FROM courses WHERE category = 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ';

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ๋Œ€๋‹ตํ•ด์ค„ ๊ฑฐ์˜ˆ์š”:


+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | courses | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1000 |    10.00 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+

์–ด๋จธ๋‚˜! ์ด๊ฒŒ ๋ญ์˜ˆ์š”? ๐Ÿ˜ฑ ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์ œ๊ฐ€ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”.

  • type: 'ALL'์€ ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์„ ์˜๋ฏธํ•ด์š”. ๊ฐ€์žฅ ๋น„ํšจ์œจ์ ์ด์ฃ .
  • possible_keys: NULL์ด๋ผ๋Š” ๊ฑด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด์—์š”.
  • rows: ์•ฝ 1000๊ฐœ์˜ ํ–‰์„ ๊ฒ€์‚ฌํ•  ๊ฑฐ๋ผ๋Š” ๋œป์ด์—์š”.

์ด๋Ÿฐ ์ •๋ณด๋ฅผ ๋ณด๊ณ  "์•„, ์—ฌ๊ธฐ์— ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•˜๊ฒ ๊ตฌ๋‚˜!"๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„ ๋‹ค์‹œ EXPLAIN์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด:


+----+-------------+---------+------------+------+---------------+-------------------+---------+-------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key               | key_len | ref   | rows | filtered | Extra       |
+----+-------------+---------+------------+------+---------------+-------------------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | courses | NULL       | ref  | idx_category  | idx_category      | 768     | const |   10 |   100.00 | Using index |
+----+-------------+---------+------------+------+---------------+-------------------+---------+-------+------+----------+-------------+

์™€์šฐ! ์™„์ „ ๋‹ฌ๋ผ์กŒ์ฃ ? ์ด์ œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹จ 10๊ฐœ์˜ ํ–‰๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด ๋ผ์š”. ์—„์ฒญ๋‚œ ๋ฐœ์ „์ด์—์š”! ๐ŸŽ‰

๐Ÿ’ก ํ”„๋กœ ํŒ!

EXPLAIN ANALYZE๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ ์‹คํ–‰ ์‹œ๊ฐ„๊นŒ์ง€ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ฃ !

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„: ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •ํ•˜๊ธฐ

์‹คํ–‰ ๊ณ„ํš์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ, ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๋นจ๋ผ์กŒ๋Š”์ง€ ์ง์ ‘ ์ธก์ •ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด์š”. ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์š”.

MySQL์„ ์˜ˆ๋กœ ๋“ค๋ฉด:


SET profiling = 1;
SELECT * FROM courses WHERE category = 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ';
SHOW PROFILES;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด์š”. ์ตœ์ ํ™” ์ „ํ›„๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ !

์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ๋น„๊ต ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ๋น„๊ต ์ตœ์ ํ™” ๋‹จ๊ณ„ ์‹คํ–‰ ์‹œ๊ฐ„ (ms) ์ตœ์ ํ™” ์ „ ์ธ๋ฑ์Šค ์ถ”๊ฐ€ ์ฟผ๋ฆฌ ์žฌ์ž‘์„ฑ 250ms 150ms 50ms

์ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์„ธ์š”. ์ตœ์ ํ™”๋ฅผ ๊ฑฐ๋“ญํ• ์ˆ˜๋ก ์‹คํ–‰ ์‹œ๊ฐ„์ด ์–ด๋–ป๊ฒŒ ์ค„์–ด๋“œ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ ? ์ด๋ ‡๊ฒŒ ์‹œ๊ฐํ™”ํ•˜๋ฉด ์šฐ๋ฆฌ์˜ ๋…ธ๋ ฅ์ด ์–ผ๋งˆ๋‚˜ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์–ด์š”!

์„ธ ๋ฒˆ์งธ ๋‹จ๊ณ„: ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์€ ํ•œ ๋ฒˆ ํ•˜๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ๊ณ„์†ํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ตœ์ ํ™”ํ•ด์•ผ ํ•ด์š”. ๋งˆ์น˜ ๊ฑด๊ฐ•๊ฒ€์ง„์„ ์ •๊ธฐ์ ์œผ๋กœ ๋ฐ›๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”!

๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, MySQL์˜ Performance Schema๋‚˜ PostgreSQL์˜ pg_stat_statements ๊ฐ™์€ ๊ฒƒ๋“ค์ด์š”.

์ด๋Ÿฐ ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”:

  • ๊ฐ€์žฅ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ
  • ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ๊ธด ์ฟผ๋ฆฌ
  • ๋””์Šคํฌ I/O๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ
  • ํŠน์ • ํ…Œ์ด๋ธ”์ด๋‚˜ ์ธ๋ฑ์Šค์˜ ์‚ฌ์šฉ ๋นˆ๋„

์ด๋Ÿฐ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ง€์†์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฐ”๋กœ ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ฃ !

๐Ÿš€ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง์˜ ์ค‘์š”์„ฑ

์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”. ์‚ฌ์šฉ์ž๋“ค์ด ๋ถˆํŽธ์„ ๊ฒช๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ฃ !

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์„ฑ๋Šฅ ์ธก์ •๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์˜€์–ด์š”. ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์žฌ๋ฏธ์žˆ์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹

์ด๋ ‡๊ฒŒ ๊พธ์ค€ํžˆ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋‹ค ๋ณด๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ ์  ๋” ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ•  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์™€์ธ์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋” ์ข‹์•„์ง€๋Š” ๊ฑฐ์ฃ ! ๐Ÿท

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด๋Ÿฐ ๋ชจ๋“  ๋…ธ๋ ฅ๋“ค์„ ์ข…ํ•ฉํ•ด์„œ "์ตœ์ข… ๋ณด์Šค"๊ธ‰ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•˜๊ฒ ์ฃ ? ์ €๋„ ๋„ˆ๋ฌด ๊ธฐ๋Œ€๋ผ์š”! ๐Ÿ˜†

๐Ÿ† ์ตœ์ข… ๋ณด์Šค: ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ์‚ฌ๋ก€ ์—ฐ๊ตฌ

์ž, ์—ฌ๋Ÿฌ๋ถ„! ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋ชจ๋“  ๊ฒƒ์„ ์ด๋™์›ํ•  ์‹œ๊ฐ„์ด์—์š”. ์ด์ œ ์ •๋ง ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ์‹ฌํ˜ธํก ํ•œ ๋ฒˆ ํ•˜์‹œ๊ณ ... ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ˜Š

์‹œ๋‚˜๋ฆฌ์˜ค: ์žฌ๋Šฅ๋„ท์˜ "์ธ๊ธฐ ๊ฐ•์‚ฌ" ํŽ˜์ด์ง€

์žฌ๋Šฅ๋„ท์—์„œ "์ด๋ฒˆ ๋‹ฌ์˜ ์ธ๊ธฐ ๊ฐ•์‚ฌ" ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด์š”. ์ด ํŽ˜์ด์ง€์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ด์š”:

  • ๊ฐ•์‚ฌ ์ด๋ฆ„
  • ๊ฐ•์‚ฌ์˜ ์ „์ฒด ์ˆ˜๊ฐ•์ƒ ์ˆ˜
  • ๊ฐ•์‚ฌ์˜ ํ‰๊ท  ๊ฐ•์˜ ํ‰์ 
  • ๊ฐ•์‚ฌ์˜ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๊ฐ•์˜ ์ œ๋ชฉ
  • ์ด๋ฒˆ ๋‹ฌ์— ์ƒˆ๋กœ ๋“ฑ๋กํ•œ ์ˆ˜๊ฐ•์ƒ ์ˆ˜

์Œ... ๊ฝค ๋ณต์žกํ•˜์ฃ ? ์ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ์ฟผ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š”:


SELECT 
    i.name AS instructor_name,
    COUNT(DISTINCT e.user_id) AS total_students,
    AVG(r.rating) AS avg_rating,
    (SELECT title FROM courses c2 
     WHERE c2.instructor_id = i.id 
     ORDER BY (SELECT COUNT(*) FROM enrollments e2 WHERE e2.course_id = c2.id) DESC 
     LIMIT 1) AS most_popular_course,
    COUNT(DISTINCT CASE WHEN e.enrolled_at >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
                        THEN e.user_id END) AS new_students_this_month
FROM 
    instructors i
    LEFT JOIN courses c ON i.id = c.instructor_id
    LEFT JOIN enrollments e ON c.id = e.course_id
    LEFT JOIN ratings r ON c.id = r.course_id
GROUP BY 
    i.id
ORDER BY 
    total_students DESC
LIMIT 10;

์šฐ์™€! ์ด ์ฟผ๋ฆฌ, ์—„์ฒญ ๋ณต์žกํ•˜์ฃ ? ๐Ÿ˜ฑ ์‹คํ–‰ํ•˜๋ฉด ์•„๋งˆ ์—„์ฒญ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฑฐ์˜ˆ์š”. ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

1๋‹จ๊ณ„: ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„

๋จผ์ € EXPLAIN์„ ์‚ฌ์šฉํ•ด์„œ ์‹คํ–‰ ๊ณ„ํš์„ ์‚ดํŽด๋ด์š”. ์•„๋งˆ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”๊ณผ ๋น„ํšจ์œจ์ ์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ ์‹คํ–‰์ด ๋ณด์ผ ๊ฑฐ์˜ˆ์š”.

2๋‹จ๊ณ„: ์ธ๋ฑ์Šค ์ตœ์ ํ™”

ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์š”:


CREATE INDEX idx_instructor_id ON courses(instructor_id);
CREATE INDEX idx_course_id ON enrollments(course_id);
CREATE INDEX idx_course_id_enrolled_at ON enrollments(course_id, enrolled_at);
CREATE INDEX idx_course_id ON ratings(course_id);

3๋‹จ๊ณ„: ์ฟผ๋ฆฌ ์žฌ๊ตฌ์„ฑ

์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ด ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•ด์š”:


WITH popular_courses AS (
    SELECT course_id, COUNT(*) as enrollment_count
    FROM enrollments
    GROUP BY course_id
),
instructor_stats AS (
    SELECT 
        i.id AS instructor_id,
        i.name AS instructor_name,
        COUNT(DISTINCT e.user_id) AS total_students,
        AVG(r.rating) AS avg_rating,
        COUNT(DISTINCT CASE WHEN e.enrolled_at >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
                            THEN e.user_id END) AS new_students_this_month
    FROM 
        instructors i
        LEFT JOIN courses c ON i.id = c.instructor_id
        LEFT JOIN enrollments e ON c.id = e.course_id
        LEFT JOIN ratings r ON c.id = r.course_id
    GROUP BY 
        i.id
)
SELECT 
    is.instructor_name,
    is.total_students,
    is.avg_rating,
    c.title AS most_popular_course,
    is.new_students_this_month
FROM 
    instructor_stats is
    JOIN courses c ON is.instructor_id = c.instructor_id
    JOIN popular_courses pc ON c.id = pc.course_id
WHERE 
    pc.enrollment_count = (
        SELECT MAX(enrollment_count)
        FROM popular_courses pc2
        JOIN courses c2 ON pc2.course_id = c2.id
        WHERE c2.instructor_id = is.instructor_id
    )
ORDER BY 
    is.total_students DESC
LIMIT 10;

์™€! ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋” ํšจ์œจ์ ์ด์—์š”. CTE(Common Table Expression)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ฃ .

๐Ÿ’ก ์ตœ์ ํ™” ํฌ์ธํŠธ

  • ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ CTE๋กœ ๋Œ€์ฒดํ•ด ๊ฐ€๋…์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๊ฐœ์„ 
  • ๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌํ•ด ๋ฉ”์ธ ์ฟผ๋ฆฌ์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ž„
  • ์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ์œผ๋กœ ์กฐ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ

4๋‹จ๊ณ„: ๊ฒฐ๊ณผ ๊ฒ€์ฆ

์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  EXPLAIN ANALYZE๋กœ ์„ฑ๋Šฅ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”. ์›๋ž˜ ์ฟผ๋ฆฌ์™€ ๋น„๊ตํ•ด์„œ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ์ธก์ •ํ•ด๋ณด์„ธ์š”.

์ฟผ๋ฆฌ ์ตœ์ ํ™” ์ „ํ›„ ๋น„๊ต ์ฟผ๋ฆฌ ์ตœ์ ํ™” ์ „ํ›„ ๋น„๊ต ์ตœ์ ํ™” ๋‹จ๊ณ„ ์‹คํ–‰ ์‹œ๊ฐ„ (์ดˆ) ์ตœ์ ํ™” ์ „ ์ตœ์ ํ™” ํ›„ 14์ดˆ 1.5์ดˆ

์™€์šฐ! ์ตœ์ ํ™” ํ›„์— ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„์ด 14์ดˆ์—์„œ 1.5์ดˆ๋กœ ์ค„์—ˆ์–ด์š”. ์ •๋ง ๋Œ€๋‹จํ•œ ๊ฐœ์„ ์ด์ฃ ? ๐Ÿ‘๐Ÿ‘๐Ÿ‘

5๋‹จ๊ณ„: ์ถ”๊ฐ€ ์ตœ์ ํ™” ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” materialized view๋ฅผ ์‚ฌ์šฉํ•ด ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘˜ ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ง ๋งŽ๋‹ค๋ฉด, ์ƒค๋”ฉ(sharding)์ด๋‚˜ ํŒŒํ‹ฐ์…”๋‹(partitioning)์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์š”.
  • ์บ์‹ฑ์„ ์ ์šฉํ•ด ์ž์ฃผ ์š”์ฒญ๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด๋‘˜ ์ˆ˜ ์žˆ์–ด์š”.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ์ „ ๊ณผ์ •์ด์—ˆ์–ด์š”. ์–ด๋– ์„ธ์š”? ์ฒ˜์Œ์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ด ๋ณด์˜€๋˜ ์ผ๋„, ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•„๊ฐ€๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ๋Š๋ผ์…จ๋‚˜์š”? ๐Ÿ˜Š

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์€ ์ •๋ง ๋์ด ์—†๋Š” ์—ฌ์ •์ด์—์š”. ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋„์ „๊ณผ ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์ฃ . ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ์žฌ๋ฏธ์žˆ๊ณ  ๋ณด๋žŒ์ฐฌ ์ผ์ด๊ธฐ๋„ ํ•ด์š”. ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด๋Ÿฐ ๊ณผ์ •์„ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด๋ฉด์„œ ์‹ค๋ ฅ์„ ํ‚ค์›Œ๋‚˜๊ฐ€์‹œ๊ธธ ๋ฐ”๋ผ์š”!

์ž, ์ด์ œ ์ •๋ง ๋งˆ์ง€๋ง‰์ด์—์š”. ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋ชจ๋“  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ  ๋งˆ๋ฌด๋ฆฌ ์ง€์–ด๋ณผ๊นŒ์š”? ๐ŸŽ‰

๐ŸŒŸ ๊ฒฐ๋ก : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์˜ ๋์€ ์–ด๋””์ธ๊ฐ€?

์™€์šฐ! ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ฃ ? ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹๊ณผ ์ฟผ๋ฆฌ ์ตœ์ ํ™”์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์‚ดํŽด๋ดค์–ด์š”. ์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”.

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์˜ ์ค‘์š”์„ฑ

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ
  • ์‹œ์Šคํ…œ ์ž์› ์ ˆ์•ฝ
  • ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ๊ณผ ๊ฐœ์„ 

2. ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ๊ธฐ๋ณธ ์›์น™

  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ
  • ์ ์ ˆํ•œ ์ธ๋ฑ์Šค ์‚ฌ์šฉ
  • ์กฐ์ธ ์ตœ์ ํ™”
  • ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฐœ์„ 

3. ์„ฑ๋Šฅ ์ธก์ •๊ณผ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„ (EXPLAIN)
  • ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •
  • ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง

4. ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

  • ํŒŒํ‹ฐ์…”๋‹
  • ์บ์‹ฑ
  • materialized view ํ™œ์šฉ

์ž, ์ด์ œ ๋‹ค์‹œ ์›๋ž˜ ์งˆ๋ฌธ์œผ๋กœ ๋Œ์•„๊ฐ€๋ณผ๊นŒ์š”? "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹: ์ฟผ๋ฆฌ ์ตœ์ ํ™”์˜ ๋์€ ์–ด๋””์ผ๊นŒ?" ๐Ÿค”

์†”์งํžˆ ๋ง์”€๋“œ๋ฆฌ๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์—๋Š” ๋์ด ์—†์–ด์š”. ๊ธฐ์ˆ ์€ ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋Š” ๋Š์ž„์—†์ด ์ฆ๊ฐ€ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ๊ณ„์† ๋ณ€ํ™”ํ•˜๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์˜ ๋งค๋ ฅ์ด๊ธฐ๋„ ํ•ด์š”!

๐Ÿ’ก ๊ธฐ์–ตํ•˜์„ธ์š”

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์€ ๋ชฉ์ ์ง€๊ฐ€ ์•„๋‹Œ ์—ฌ์ •์ž…๋‹ˆ๋‹ค. ๋Š์ž„์—†๋Š” ํ•™์Šต๊ณผ ๊ฐœ์„ ์˜ ๊ณผ์ •์ด์ฃ . ์™„๋ฒฝํ•จ์„ ์ถ”๊ตฌํ•˜๋˜, ํ˜„์‹ค์ ์ธ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ณ  ์ ์ง„์ ์œผ๋กœ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.

์—ฌ๋Ÿฌ๋ถ„, ์ด ๊ธ€์„ ์ฝ์œผ๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ํ†ต์ฐฐ์„ ์–ป์œผ์…จ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•˜๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์…จ๋‚˜์š”? ์–ด๋–ค ๊ฒฝ์šฐ๋“ , ์ด ์ง€์‹์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์—ฌ์ •์— ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ผ์š”.

๊ธฐ์–ตํ•˜์„ธ์š”, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠœ๋‹์€ ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ ์  ๊ณผ์ œ๊ฐ€ ์•„๋‹ˆ์—์š”. ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค์˜ ์„ฑ๊ณผ๋ฅผ ๋†’์ด๋ฉฐ, ๋” ๋‚˜์€ ๋””์ง€ํ„ธ ์„ธ์ƒ์„ ๋งŒ๋“œ๋Š” ์ค‘์š”ํ•œ ๊ณผ์ •์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘๊ฐ€ ์ด ์—ฌ์ •์—์„œ ์ฆ๊ฑฐ์›€์„ ๋Š๋ผ๊ณ  ์„ฑ์žฅํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค! ๐Ÿš€

์ž, ์ด์ œ ์ •๋ง ๋์ด์—์š”. ๊ธด ๊ธ€ ์ฝ๋Š๋ผ ๊ณ ์ƒ ๋งŽ์œผ์…จ์–ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์–ธ์ œ๋‚˜ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธธ ๋ฐ”๋ž„๊ฒŒ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜Š