
์ ๋ฌด/๊ต์ก
>ํ๋ก๊ทธ๋๋ฐ ๊ด๋ จ
๐ PHP ๊ณ ๊ธ - 7์ฃผ์ฐจ: ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋๋ฒ๊น - 01 DB ์ฟผ๋ฆฌ ์ต์ ํ (์ธ๋ฑ์ค ํ์ฉ)
![]() |
ํ์ | 10.0 | ๋ผ์ด์ผ์ค | free |
---|---|---|---|---|
์ฌ์ฉ์ํ์ | 10.0 | ์ด์์ฒด์ | ||
๋ค์ด๋ก๋ | 1 | ํ์ผํฌ๊ธฐ | 0 | |
์ ์์ฌ | LUZENSOFT | ๋ฑ๋ก์ผ | 2025-09-21 19:29:53 | |
์กฐํ์ | 16 |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ์ต์ ํ์ ์ค์์ฑ
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ธ ์ํฅ์ ์ค๋๋ค. ํนํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ์๋๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต ์๊ฐ์ ๊ฒฐ์ ํ๋ ํต์ฌ ์์์ ๋๋ค. ๋๋ฆฐ ์ฟผ๋ฆฌ๋ ์๋ฒ์ ๋ถํ๋ฅผ ์ฆ๊ฐ์ํค๊ณ , ์ฌ์ฉ์์๊ฒ ์ง์ฐ์ ์ด๋ํ์ฌ ์๋น์ค์ ๋ง์กฑ๋๋ฅผ ๋จ์ด๋จ๋ฆฝ๋๋ค. ์ด ๋ฌธ์ ์ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ํด๊ฒฐ์ฑ ์ค ํ๋๋ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ๐ก
์ธ๋ฑ์ค๋ ๋ฌด์์ธ๊ฐ?
๋ฐ์ดํฐ๋ฒ ์ด์ค #์ธ๋ฑ์ค(Index)๋ ์ฑ ์ #๋ชฉ์ฐจ ์ ๊ฐ์ต๋๋ค. ํน์ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋๋ก ๋๋ ์ผ์ข ์ #์์ธํ ์ญํ ์ ํฉ๋๋ค. ์ธ๋ฑ์ค๋ ํ ์ด๋ธ์ ํน์ ์ด(์ปฌ๋ผ)์ ์์ฑ๋๋ฉฐ, #์ฟผ๋ฆฌ(Query)๊ฐ ์คํ๋ ๋ #๋ฐ์ดํฐ๋ฒ ์ด์ค_์์ง ์ด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ค์บํ๋ ๋์ , ์ธ๋ฑ์ค๋ฅผ ํตํด ํ์ํ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๋ก ์ฐพ์๊ฐ ์ ์๊ฒ ํด์ค๋๋ค. ๐
์ธ๋ฑ์ค ํ์ฉ ์ ์ฃผ์์ฌํญ
์ธ๋ฑ์ค๋ #์ฑ๋ฅ_์ต์ ํ ์ ๋งค์ฐ ํจ๊ณผ์ ์ด์ง๋ง, ๋ฌด๋ถ๋ณํ๊ฒ ์ฌ์ฉํ๋ฉด ์คํ๋ ค #์ฑ๋ฅ_์ ํ ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋ค์ ์ฌํญ๋ค์ ๊ณ ๋ คํ์ฌ ์ ์คํ๊ฒ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
#์ฐ๊ธฐ_์์ (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
์ด์ ์ธ๋ฑ์ค ์ด๋ฆ์ด ํ์๋๋ฉด ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ๋๊ณ ์์์ ์๋ฏธํฉ๋๋ค.
์ฟผ๋ฆฌ ์ต์ ํ ์ค์ต
์ด์ ๊ฐ๋จํ ์ค์ต์ ํตํด ์ธ๋ฑ์ค ์ ๋ฌด์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ํ์ธํด ๋ด ์๋ค.
#์ธ๋ฑ์ค_์๋_์ํฉ: ๋์ฉ๋์
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";
#์ธ๋ฑ์ค_์๋_์ํฉ:
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";
์ฑ๋ฅ ์ธก์ ๊ฒฐ๊ณผ, ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ฟผ๋ฆฌ๊ฐ ํจ์ฌ ๋ ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ต์ ํ๋ ๋ณต์กํ์ง๋ง, ์ธ๋ฑ์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ด๋ฃฐ ์ ์์ต๋๋ค. ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ฌ๋ฌ๋ถ์ #์น_์๋น์ค ์ ์ ์ฉํ์ฌ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์๋น์ค๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์! ๐