216.73.216.217 TODAY : 4,545

์—…๋ฌด/๊ต์œก

 > 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ด€๋ จ

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 7์ฃผ์ฐจ: ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋””๋ฒ„๊น… - 01 DB ์ฟผ๋ฆฌ ์ตœ์ ํ™” (์ธ๋ฑ์Šค ํ™œ์šฉ)

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 7์ฃผ์ฐจ: ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋””๋ฒ„๊น… - 01 DB ์ฟผ๋ฆฌ ์ตœ์ ํ™” (์ธ๋ฑ์Šค ํ™œ์šฉ)
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-09-21 19:29:53
์กฐํšŒ์ˆ˜ 16
- ์„ค๋ช…

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ


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



์ธ๋ฑ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

uploadImage

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค #์ธ๋ฑ์Šค(Index)๋Š” ์ฑ…์˜ #๋ชฉ์ฐจ ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์ผ์ข…์˜ #์ƒ‰์ธํ‘œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ํ…Œ์ด๋ธ”์˜ ํŠน์ • ์—ด(์ปฌ๋Ÿผ)์— ์ƒ์„ฑ๋˜๋ฉฐ, #์ฟผ๋ฆฌ(Query)๊ฐ€ ์‹คํ–‰๋  ๋•Œ #๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค_์—”์ง„ ์ด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์Šค์บ”ํ•˜๋Š” ๋Œ€์‹ , ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๋กœ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ๐Ÿ“š



์ธ๋ฑ์Šค ํ™œ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

uploadImage

์ธ๋ฑ์Šค๋Š” #์„ฑ๋Šฅ_์ตœ์ ํ™” ์— ๋งค์šฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค #์„ฑ๋Šฅ_์ €ํ•˜ ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์‚ฌํ•ญ๋“ค์„ ๊ณ ๋ คํ•˜์—ฌ ์‹ ์ค‘ํ•˜๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • #์“ฐ๊ธฐ_์ž‘์—… (INSERT, UPDATE, DELETE) ๋ถ€ํ•˜: ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋„ ํ•จ๊ป˜ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์“ฐ๊ธฐ ์ž‘์—…์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

  • #์ €์žฅ_๊ณต๊ฐ„_์‚ฌ์šฉ: ์ธ๋ฑ์Šค๋„ ๋ฌผ๋ฆฌ์ ์ธ ์ €์žฅ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ์ €์žฅ ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

  • #์นด๋””๋„๋ฆฌํ‹ฐ (Cardinality): ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ์—ด์˜ ๋ฐ์ดํ„ฐ #์ค‘๋ณต๋„ ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต๋„๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก (์ฆ‰, ๊ณ ์œ ํ•œ ๊ฐ’์ด ๋งŽ์„์ˆ˜๋ก) ์ธ๋ฑ์Šค์˜ ํšจ์œจ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, '์„ฑ๋ณ„'๊ณผ ๊ฐ™์€ ์ค‘๋ณต๋„๊ฐ€ ๋†’์€ ์—ด๋ณด๋‹ค๋Š” '์‚ฌ์šฉ์ž ID'๋‚˜ '์ด๋ฉ”์ผ ์ฃผ์†Œ'์™€ ๊ฐ™์ด ๊ณ ์œ ํ•œ ๊ฐ’์ด ๋งŽ์€ ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.



์ธ๋ฑ์Šค ํ™œ์šฉ ์ „๋žต ๋ฐ ์‹ค์Šต ์˜ˆ์‹œ



1. ์ž์ฃผ ๊ฒ€์ƒ‰๋˜๋Š” ์—ด์— ์ธ๋ฑ์Šค ์ƒ์„ฑํ•˜๊ธฐ


WHERE ์ ˆ์ด๋‚˜ JOIN ์กฐ๊ฑด์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์—ด์—๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

SQL

-- ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์˜ 'email' ์—ด์— ์ธ๋ฑ์Šค ์ƒ์„ฑ
CREATE INDEX idx_users_email ON users (email);


2. ๋ณตํ•ฉ(Compound) ์ธ๋ฑ์Šค ํ™œ์šฉํ•˜๊ธฐ


๋‘ ๊ฐœ ์ด์ƒ์˜ ์—ด์„ ์กฐํ•ฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” #๋ณตํ•ฉ_์ธ๋ฑ์Šค๋Š” ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณตํ•ฉ ์ธ๋ฑ์Šค์˜ ์—ด ์ˆœ์„œ๋Š” ์ฟผ๋ฆฌ์˜ WHERE ์ ˆ ์กฐ๊ฑด ์ˆœ์„œ์™€ ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

SQL

-- 'category'์™€ 'created_at' ์—ด์„ ์กฐํ•ฉํ•˜์—ฌ ์ธ๋ฑ์Šค ์ƒ์„ฑ
-- WHERE category = 'A' AND created_at > '2025-01-01' ์ฟผ๋ฆฌ์— ํšจ์œจ์ 
CREATE INDEX idx_products_category_created_at ON products (category, created_at);


3. EXPLAIN์œผ๋กœ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„ํ•˜๊ธฐ


EXPLAIN ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๋Š”์ง€ #์‹คํ–‰_๊ณ„ํš ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ธ๋ฑ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€, #ํ’€_ํ…Œ์ด๋ธ”_์Šค์บ” (Full Table Scan)์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์€์ง€ ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQL

-- ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš ๋ถ„์„ ์˜ˆ์‹œ
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

EXPLAIN ๊ฒฐ๊ณผ์—์„œ key ์—ด์— ์ธ๋ฑ์Šค ์ด๋ฆ„์ด ํ‘œ์‹œ๋˜๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.



์ฟผ๋ฆฌ ์ตœ์ ํ™” ์‹ค์Šต

uploadImage

์ด์ œ ๊ฐ„๋‹จํ•œ ์‹ค์Šต์„ ํ†ตํ•ด ์ธ๋ฑ์Šค ์œ ๋ฌด์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.

  1. #์ธ๋ฑ์Šค_์—†๋Š”_์ƒํ™ฉ: ๋Œ€์šฉ๋Ÿ‰์˜ users ํ…Œ์ด๋ธ”์—์„œ email์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    PHP

    $start = microtime(true);
    $conn->query("SELECT * FROM users WHERE email = 'test@example.com'");
    $end = microtime(true);
    echo "Without index: " . ($end - $start) . " seconds";
    
  2. #์ธ๋ฑ์Šค_์žˆ๋Š”_์ƒํ™ฉ: email ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ ํ›„ ๋™์ผํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    PHP

    // SQL: CREATE INDEX idx_users_email ON users (email);
    $start = microtime(true);
    $conn->query("SELECT * FROM users WHERE email = 'test@example.com'");
    $end = microtime(true);
    echo "With index: " . ($end - $start) . " seconds";
    

์„ฑ๋Šฅ ์ธก์ • ๊ฒฐ๊ณผ, ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•œ ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๋” ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋งˆ์น˜๋ฉฐ


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