1. ๊ฐ์
JOIN ์ ๋งค๋ฒ ์ด๋ค ๊ฑธ ์จ์ผ ํ๋์ง ํท๊ฐ๋ฆฐ๋ค. ํนํ LEFT ์ RIGHT ๋ ์ผ์ชฝ/์ค๋ฅธ์ชฝ๋ง ๋ฐ๊ฟ ์ฐ๋ฉด ๋๋๋ฐ๋ ๋งค๋ฒ ๋ค์ ์๊ฐํ๊ฒ ๋๋ค. ์ด๋ฒ ๊ธ์ ๋ค ๊ฐ์ง JOIN ์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํ๊ณ , ์คํ๊ณํ์์ ์ตํฐ๋ง์ด์ ๊ฐ ํ ์ด๋ธ์ ์ด๋ค ์์๋ก ๋๋์ง ๊ฐ์ ์ก์๋ณธ๋ค.
2. ํต์ฌ ๋ด์ฉ
2-1. INNER JOIN โ ์์ชฝ์ ๋ค ์๋ ๊ฒ๋ง
SELECT u.name, o.id
FROM users u
INNER JOIN orders o ON u.id = o.user_id;users ์ orders ์์ชฝ์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ์ด ์์ ๋๋ง ๊ฒฐ๊ณผ์ ๋์จ๋ค. ์ฃผ๋ฌธ์ด ์๋ ์ฌ์ฉ์๋ ๊ฒฐ๊ณผ์์ ๋น ์ง๋ค.
2-2. LEFT JOIN โ ์ผ์ชฝ์ ๋ค ์ด๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ์ ๋ง์ผ๋ฉด ๋ถ์ธ๋ค
SELECT u.name, o.id
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;์ผ์ชฝ ํ
์ด๋ธ(users)์ ํ์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ ํ๋ ์ ๋ถ ๋จ๋๋ค. ๋ง๋ orders ํ์ด ์์ผ๋ฉด ๊ทธ ์ปฌ๋ผ์ NULL ๋ก ์ฑ์์ง๋ค. โ์ฌ์ฉ์๋ณ ์ฃผ๋ฌธ ๊ฑด์๋ฅผ ๋ณด๊ณ ์ถ์๋ฐ ์ฃผ๋ฌธ์ด 0๊ฑด์ธ ์ฌ์ฉ์๋ 0์ผ๋ก ๋ณด๊ณ ์ถ๋คโ ๊ฐ์ ์ํฉ์ ์ด๋ค. RIGHT JOIN ์ ๋ฐ๋๋ก ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋ค ์ด๋ฆฌ๋ ๊ฒ๋ฟ์ด๋ผ, ํ
์ด๋ธ ์์๋ง ๋ฐ๊พธ๋ฉด LEFT JOIN ์ผ๋ก ํญ์ ๋๊ฐ์ด ํํํ ์ ์๋ค. ๊ทธ๋์ ์ค๋ฌด์์ RIGHT JOIN ์ ์ง์ ์ฐ๋ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค.
2-3. FULL JOIN โ ์์ชฝ ๋ค ์ด๋ฆฐ๋ค
SELECT u.name, o.id
FROM users u
FULL JOIN orders o ON u.id = o.user_id;์์ชฝ ์ค ์ด๋ ํ์ชฝ์๋ง ์์ด๋ ๊ฒฐ๊ณผ์ ๋จ๊ณ , ๋ง๋ ์ชฝ์ด ์์ผ๋ฉด ๊ทธ ์๋ฆฌ๋ NULL ์ด๋ค. ๋ ์งํฉ์ ์ฐจ์ด๋ฅผ ์ฐพ์ ๋(์: ์ด์ชฝ์๋ ์๋๋ฐ ์ ์ชฝ์๋ ์๋ ๋ฐ์ดํฐ ์ฐพ๊ธฐ) ์์ฃผ ์ด๋ค. MySQL ์ FULL JOIN ์ ์ง์ํ์ง ์์์ LEFT JOIN ๊ณผ RIGHT JOIN ๊ฒฐ๊ณผ๋ฅผ UNION ์ผ๋ก ํฉ์ณ ํ๋ด ๋ด์ผ ํ๋ค.
2-4. ์ตํฐ๋ง์ด์ ๋ ์ด๋ค ์์๋ก ๋๋
JOIN ์ ์์ฑํ ์์์ ์ค์ ๋ก ์ตํฐ๋ง์ด์ ๊ฐ ํ
์ด๋ธ์ ๋๋ ์์๋ ๋ค๋ฅผ ์ ์๋ค. EXPLAIN ์ ์ฐ์ด๋ณด๋ฉด ์ตํฐ๋ง์ด์ ๊ฐ ๊ณ ๋ฅธ ์กฐ์ธ ๋ฐฉ์์ด ๋์จ๋ค. ๊ฐ๋ง ์ก์๋๋ฉด ์คํ๊ณํ์ ์ฝ์ ๋ ๋์์ด ๋๋ค.
- Nested Loop Join: ํ์ชฝ ํ ์ด๋ธ(์ฃผ๋ก ํ์ด ์ ์ ์ชฝ, ๋๋ผ์ด๋น ํ ์ด๋ธ)์ ์ํํ๋ฉด์ ๊ฐ ํ๋ง๋ค ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง๋ ํ์ ์ฐพ๋๋ค. ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์ ์กฐ์ธ ์ปฌ๋ผ์ ์ธ๋ฑ์ค ๊ฐ ์์ผ๋ฉด ๋งค์ฐ ๋น ๋ฅด๋ค. ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด ์์ชฝ ๋ฃจํ๋ง๋ค ํ์ค์บ์ด ๋ฐ๋ณต๋ผ ๋น์ฉ์ด ๊ธ๊ฒฉํ ์ปค์ง๋ค.
- Hash Join: ์์ ์ชฝ ํ ์ด๋ธ๋ก ํด์ ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค๊ณ , ํฐ ์ชฝ ํ ์ด๋ธ์ ํ ๋ฒ ํ์ผ๋ฉด์ ํด์๋ก ๋งค์นญํ๋ค. ์ธ๋ฑ์ค๊ฐ ์์ด๋ ์ธ ์ ์๊ณ , ๋๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์กฐ์ธํ ๋ ์ ๋ฆฌํ๋ค.
- Merge Join: ์์ชฝ ํ ์ด๋ธ์ด ์กฐ์ธ ํค ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ ์ ๋ ฌ๋ผ ์์ผ๋ฉด(๋๋ ์ ๋ ฌ ๋น์ฉ์ ๊ฐ์ํ๊ณ ) ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ชฉ๋ก์ ์งํผ์ฒ๋ผ ๋ง๋ฌผ๋ ค ๊ฐ๋ฉฐ ํฉ์น๋ค.
์ตํฐ๋ง์ด์ ๋ ํ
์ด๋ธ ํต๊ณ(ํ ์, ์นด๋๋๋ฆฌํฐ)๋ฅผ ๋ณด๊ณ ์ด ์ค ๋ญ๊ฐ ์์ง ํ๋จํ๋ค. ๊ทธ๋์ ๊ฐ์ ์ฟผ๋ฆฌ๋ผ๋ ๋ฐ์ดํฐ๊ฐ ์์ด๋ฉด์ ์คํ ๊ณํ์ด Nested Loop ์์ Hash Join ์ผ๋ก ๋ฐ๋๋ ๊ฒฝ์ฐ๊ฐ ํํ๋ค. ํต๊ณ๊ฐ ์ค๋๋ผ(ANALYZE ๋ฅผ ์ ๋๋ ค์) ์ตํฐ๋ง์ด์ ๊ฐ ์๋ชป ํ๋จํ๋ ๊ฒฝ์ฐ๋ ์ค๋ฌด์์ ์์ฃผ ๋ณธ๋ค.
3. ๋ง๋ฌด๋ฆฌ
์์ฝ
- INNER JOIN ์ ์์ชฝ ๋ค ๋ง๋ ๊ฒ๋ง, LEFT/RIGHT JOIN ์ ํ์ชฝ์ ์ ๋ถ ์ด๋ฆฌ๊ณ ๋๋จธ์ง๋ NULL, FULL JOIN ์ ์์ชฝ ๋ค ์ด๋ฆฐ๋ค.
- RIGHT JOIN ์ ํ ์ด๋ธ ์์๋ง ๋ฐ๊พธ๋ฉด LEFT JOIN ์ผ๋ก ํญ์ ํํ ๊ฐ๋ฅํด์ ์ค๋ฌด์์ ์ ์ ์ด๋ค.
- ์ตํฐ๋ง์ด์ ๋ ์์ฑ ์์๊ฐ ์๋๋ผ ํต๊ณ๋ฅผ ๋ณด๊ณ ์กฐ์ธ ์์์ ๋ฐฉ์(Nested Loop/Hash/Merge)์ ๊ณ ๋ฅธ๋ค.
- ํต๊ณ๊ฐ ์ค๋๋๋ฉด ์ตํฐ๋ง์ด์ ๊ฐ ์๋ชป๋ ์คํ๊ณํ์ ๊ณ ๋ฅผ ์ ์๋ค.
๋ค์์ ์๋์ฐ ํจ์ ์ด๋ค.