2์ฅ SQL ํ๋ ์ฉ์ด๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ
2.1.1 ๋ฌผ๋ฆฌ ์์ง๊ณผ ์ค๋ธ์ ํธ ์ฉ์ด
MySQL์ด๋ผ๋ DBMS๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ์ฐ์ฐ์ ์ํํ๋ค.
- ์คํ๋ SQL ๋ฌธ์ ๋ค์ํ ๋ฌธ๋ฒ ๋ฐ ๊ตฌ๋ฌธ์ผ๋ก ๊ฒ์ฌ(Parser)
- ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ฐพ์๊ฐ๋ ์ ๋ต์ ๊ณํ ์๋ฆฝ(Optimizer)
- ์คํ ๋ฆฌ์ง ์์ง์ ์ํ ๋ฐ์ดํฐ๊น์ง ์ฐพ์๊ฐ ๋ค ํด๋น ๋ฐ์ดํฐ๋ฅผ MySQL ์์ง์ผ๋ก ์ ๋ฌ.
- MySQL ์์ง์ ์ ๋ฌ๋ ๋ฐ์ดํฐ์์ ๋ถํ์ํ ๋ถ๋ถ์ ํํฐ๋งํ๊ณ ํ์ํ ์ฐ์ฐ์ ์ํํ ๋ค ์ต์ข ๊ฒฐ๊ณผ ์ ๋ฌ.
์คํ ๋ฆฌ์ง ์์ง
(InnoDB, MyISAM, Memory ๋ฑ) ์คํ ๋ฆฌ์ง ์์ง์ ์ฌ์ฉ์๊ฐ ์์ฒญํ SQL ๋ฌธ์ ํ ๋๋ก DB์ ์ ์ฅ๋ ๋์คํฌ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ ์ํ.
์ผ๋ฐ์ ์ผ๋ก ์จ๋ผ์ธ์์ ํธ๋์ญ์ ๋ฐ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ OLTP(Online Transaction Processing) ํ๊ฒฝ์ด ๋๋ค์์ธ ๋งํผ ์ฃผ๋ก InnoDB ์์ง์ ์ฌ์ฉํ๋ค.
๋์ฉ๋ ์ฐ๊ธฐ ํธ๋์ญ์ ์ด ๋ฐ์ํ๋ฉด MyISAM ์์ง, ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ์ฌ ๋น ๋ฅด๊ฒ ์ฝ๊ธฐ ์ํ๋ฉด Memory ์์ง์ ์ฌ์ฉํ๋ ์์ผ๋ก ์์ฉ์ด ๊ฐ๋ฅํ๋ค.
-- MySQL DBMS ์ฌ์ฉ์ค์ธ ์์ง ํ์ธ ๋ฒ
SELECT ENGINE, TRANSACTIONS, COMMENT
FROM information_Schema.engines;
2.1.2 SQL ํ๋ก์ธ์ค ์ฉ์ด
- SQL ๋ฌธ์ ์คํํ๋ฉด, **ํ์(Parser)**๋ MySQL์ด ์ดํดํ ์ ์๋ ์ต์ ๋จ์๋ก ๊ตฌ์ฑ์์๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ตฌ์ฑ์์ ํธ๋ฆฌ๋ก ๋ง๋ ๋ค.
- ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ณผ์ ์์ ๋ฌธ๋ฒ ์ค๋ฅ ๊ฒํ , ํธ๋ฆฌ์ ์ต์ ๋จ์๋ >, <, = ์ ๊ธฐํธ ํน์ SQL ํค์๋
- **์ ์ฒ๋ฆฌ๊ธฐ(PreProcessor)**๋ ์์ฑ๋ ํธ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ ๋๋ก, ์ด๋ฏธ ๋ง๋ค์ด์ง ํ ์ด๋ธ์ด๋ ๋ทฐ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ง ์๋์ง, ์กด์ฌํ์ง ์์ ์ด์ ํฌํจํ์ง๋ ์๋์ง, ์กฐํ ๊ถํ์ด ์๋ ํ ์ด๋ธ์ ์กฐํํ๋์ง ๋ฑ์ ์ ํจ์ฑ ๊ฒ์ฆ.
- **์ตํฐ๋ง์ด์ (Optimizer)**๋ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ค๋ธ์ ํธ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ํ ์คํ ๊ณํ ์๋ฆฝ
- **์์ง ์คํ๊ธฐ(Engin Executor)**๋ ์๋ฆฝ๋ ์คํ ๊ณํ์ผ๋ก ์คํ ๋ฆฌ์ง ์์ง์ ํธ์ถํด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ.
- ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ์์ง ์คํ๊ธฐ๊ฐ ๋ถํ์ํ ๋ฐ์ดํฐ ํํฐ๋งํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฌ.
์ตํฐ๋ง์ด์
DBMS์๋๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฅ ํต์ฌ์ ์ธ ์ญํ .
ํ์ ํธ๋ฆฌ๋ฅผ ํ ๋๋ก ํ์ํ์ง ์์ ์กฐ๊ฑด ์ ๊ฑฐ, ์ฐ์ฐ ๊ณผ์ ๋จ์ํ, ํ ์ด๋ธ ์ ๊ทผ ์์ ์ ์ด, ์ธ๋ฑ์ค ์ฌ์ฉ ์ฌ๋ถ ๊ฒฐ์ , ์์ ํ ์ด๋ธ ์ฌ์ฉ ์ฌ๋ถ ๊ฒฐ์ ๋ฑ์ ์คํ ๊ณํ ์๋ฆฝ.
๋จ, ์คํ ๊ณํ์ผ๋ก ๋์ถํ ์ ์๋ ๊ฒฝ์ฐ์ ์๊ฐ ์ง๋์น๊ฒ ๋ง์ ๊ฒฝ์ฐ ๋ชจ๋ ์คํ ๊ณํ์ ํ๋จํ์ง ์๋๋ค.
์ด๊ฒ์ ์ตํฐ๋ง์ด์ ๊ฐ ์ ํํ ๊ฒฐ๊ณผ๊ฐ ์ต์์ ์คํ ๊ฒฐ๊ณผ๋ ์๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์์ง ์คํ๊ธฐ
์ตํฐ๋ง์ด์ ์ ์คํ ๊ณํ์ ํตํด ์คํ ๋ฆฌ์ง ์์ง์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ .
์ฝ์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ, ์กฐ์ธ, ๋ถํ์ํ ๋ฐ์ดํฐ ํํฐ๋ง ์ฒ๋ฆฌ.
MySQL ์์ง์ ๋ถํ๋ฅผ ์ค์ด๋ ค๋ฉด ์คํ ๋ฆฌ์ง ์์ง์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ์์ ์ค์ด๋๊ฒ ๋งค์ฐ ์ค์!
2.1.3 DB ์ค๋ธ์ ํธ ์ฉ์ด
MySQL์ 2์ฐจ์ ๋ฐฐ์ด ํํ๋ก ํ ์ด๋ธ์ ๊ด๋ฆฌํ๋ค.
ํ ์ด๋ธ์ ๋ก์ฐ(ํ)๊ณผ ์ปฌ๋ผ(์ด)์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ํํํ๋ค.
๊ธฐ๋ณธํค Primary Key (์ฃผ ํค)
ํน์ ํ์ ๋ํํ๋ ์ด์ ๊ฐ๋ฅดํค๋ ์ฉ์ด
MySQL์์ ๊ธฐ๋ณธ ํค๋ **ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค(Clustered Index)**๋ก ์๋ํ๋ค.
์ด๋ ๊ธฐ๋ณธ ํค์ ๊ตฌ์ฑ ์ด ์์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฌผ๋ฆฌ์ ์ธ ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๊ฐ ์์ธ๋ค๋ ๋ป์ด๋ค.
์ฆ, ๋น์ทํ ๊ธฐ๋ณธ ํค ๊ฐ๋ค์ด ๊ทผ๊ฑฐ๋ฆฌ์ ์ ์ฌ๋๋ฏ๋ก ๊ธฐ๋ณธ ํค๋ฅผ ํ์ฉํ์ฌ ์ธ๋ฑ์ค ์ค์บ์ ์ํํ๋ฉฐ ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ธ๋ฑ์ค์ ์ฃผ์์ฌํญ ๊ธฐ๋ณธ ํค์ ๋๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์ ์ฅ๋๋ ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ด ๋ญ๋น๋๋ ํํธ ๋ฐ์ดํฐ์ ์ฝ์ , ์ญ์ , ์์ ์ ๋ฐ๋ฅธ ์ธ๋ฑ์ค ์ ๋ ฌ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค. ์์ CREATE TABLE ํ์ ( ํ๋ฒ INT(11) NOT NULL, ์ด๋ฆ VARCHAR(14) NOT NULL, … PRIMARY KEY (ํ๋ฒ), INDEX I_ํ๋ฒ (ํ๋ฒ) ) ์ด๋ฌํ ์ธ๋ฑ์ค์ ๊ฒฝ์ฐ ๊ณต๊ฐ ๋ญ๋น & ์ค๋ฒํค๋ ๋ฐ์์ผ๋ก ๋น์ฉ์ฆ๊ฐ → ์ญ์ ํ์.
์ธ๋ ํค Foreign Key
์ธ๋ ํค๋ ์ธ๋ถ์ ์๋ ํ ์ด๋ธ์ ํญ์ ์ฐธ์กฐํ๋ฉด์, ์ธ๋ถ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํจ๊ป ์ํฅ์ ๋ฐ๋ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ํค.
์ฐ๊ด๊ด๊ณ๊ฐ ํ์ํ ํ ์ด๋ธ์์์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ ๋๋ง๋ค ์ธ๋ ํค ์ค์ ์กฐ๊ฑด์ ํญ์ ๊ฒ์ฆํ๋ฏ๋ก ๋ฐ์ดํฐ ์ ํฉ์ฑ ํฅ์์ ์ํด์๋ผ๋ ์ธ๋ ํค๋ฅผ ์ค์ ํด์ผ ํ๋ค.
์ธ๋ฑ์ค Index
์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํค ๊ฐ์ผ๋ก ์ค์ ๋ฐ์ดํฐ ์์น๋ฅผ ์๋ณํ๊ณ ๋ฐ์ดํฐ ์ ๊ทผ์๋๋ฅผ ๋์ด๊ณ ์ ์์ฑ๋๋, ํค ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์ค๋ธ์ ํธ์ด๋ค.
๊ณ ์ ์ธ๋ฑ์ค Unique Index
์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์ด๋ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ผํ๋ค๋ ์๋ฏธ์ด๋ค.
์ฐจ๋ก๋ก ์ ๋ ฌ๋๋ ์ธ๋ฑ์ค ์ด์ ๋ฐ์ดํฐ๋ ์๋ก ์ค๋ณต๋์ง ์๊ณ ์ ์ผ์ฑ์ ์ ์งํ๋ค.
ALTER TABLE ํ์
ADD UNIQUE INDEX ์ฐ๋ฝ์ฒ_์ธ๋ฑ์ค(์ฐ๋ฝ์ฒ);
๊ธฐ๋ณธ ํค์ ๊ณ ์ ์ธ๋ฑ์ค์ ์ฐจ์ด์ ๊ธฐ๋ณธ ํค์ ๊ณ ์ ์ธ๋ฑ์ค ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ์ผ์ฑ์ ๋ณด์ฅํด์ผ ํ๋ ํน์ฑ๊ณผ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ํ ์ธ๋ฑ์ค์ ์๋จ์ผ๋ก ์ฌ์ฉ ๋ค๋ง, ๊ธฐ๋ณธ ํค์๋ NULL์ ์ ๋ ฅํ ์ ์์ง๋ง ๊ณ ์ ์ธ๋ฑ์ค์๋ ์ผ๋ง๋ ์ง ์ ๋ ฅํ ์ ์๋ค๋ ์ฐจ์ด์ ์ด ์กด์ฌ.
๋น๊ณ ์ ์ธ๋ฑ์ค Non-unique Index
๋น๊ณ ์ ์ธ๋ฑ์ค๋ ๊ณ ์ ์ธ๋ฑ์ค์์ ๋ฐ์ดํฐ์ ์ ์ผํ ์์ฑ๋ง ์ ์ธํ ํค์ด๋ค.
์ธ๋ฑ์ค๊ฐ ์ฌ์ ๋ ฌ๋๋๋ผ๋ ์ธ๋ฑ์ค ์ด์ ์ค๋ณต ์ฒดํฌ๋ฅผ ๊ฑฐ์น์ง ์๋๋ค.
ALTER TABLE ํ์
ADD INDEX ์ด๋ฆ_์ธ๋ฑ์ค (์ด๋ฆ);
๋ทฐ View
๋ทฐ == ๊ฐ์ ํ ์ด๋ธ
์ ํ๋ ์ ๋ณด๋ง์ ์ ๊ณตํ ์ ์๋ค.
์์คํ ์ ์์ ํ๊ฒ ์ด์ํ๊ณ ๊ฐ๋ฐํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๋งํผ ๋ณด์์ฑ ์ธก๋ฉด์์ ๋ทฐ์ ๊ฐ์น๊ฐ ๋ถ๊ฐ๋ ์ ์๋ค.
๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ผ๋ถ ๋ฐ์ดํฐ์ ๋ํด์๋ง ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ฐํ๊ณ , ๋ ธ์ถ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๋ํด์๋ ์ ์ฝ์ ์ค์ ํ ์ ์๋ ๋ณด์์ฑ ๋๋ฌธ. ๋ํ, ์ฌ๋ฌ ๊ฐ์ ํ ์ด๋ธ์ ๋ณํฉํด์ ํ์ฉํ ๋๋ ์ฑ๋ฅ์ ๊ณ ๋ คํ ์ต์ ํ๋ ๋ทฐ๋ฅผ ์์ฑํจ์ผ๋ก์จ ์ผ๊ด๋ ์ฑ๋ฅ ์ ๊ณต
2.2.1 ์๋ธ์ฟผ๋ฆฌ ์์น์ ๋ฐ๋ฅธ SQL ์ฉ์ด
์๋ธ์ฟผ๋ฆฌ(subquery)๋ ์ฟผ๋ฆฌ ์์ ๋ณด์กฐ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฉ์ด์ด๋ค.
๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ SELECT ๋ฌธ์ธ ๋ฉ์ธ ์ฟผ๋ฆฌ(main query)๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ ์์ฑ๋ SELECT ์ ๋ฐ๋ผ ๋ถ๋ฆฌ๋ ์ด๋ฆ์ด ๋ค๋ฅด๋ค.
SELECT (SELECT ... FROM ...) -- SELECT ์ : ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ (scalar subquery)
FROM (SELECT ... FROM ...) -- FROM ์ : ์ธ๋ผ์ธ ๋ทฐ(inline view)
WHERE COLUMN_NAME IN (SELECT ... FROM ...) -- WHERE ์ : ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ(nested subquery)
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
SELECT ์ ์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋ค.
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ SELECT ์ ๋ฟ๋ง ์๋๋ผ FROM , WHERE ์ ์์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ด๊ฐ์ 1ํ 1์ด์ ๊ตฌ์กฐ๋ก ์ถ๋ ฅ๋์ด์ผ ํ๋ค.
๋ง์ฝ ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ด 2๊ฐ ์ด์ ๋์จ๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค.
์ธ๋ผ์ธ ๋ทฐ
FROM ์ ์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ํ๋ค.
FROM ์ ๋ด๋ถ์์ ์ผ์์ ์ผ๋ก ๋ทฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ด๋ฏ๋ก ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
์ธ๋ผ์ธ ๋ทฐ์ ๊ฒฐ๊ณผ๋ ๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋์คํฌ์ ์์ ํ ์ด๋ธ์ ์์ฑํ์ฌ ํ์ฉํ๋ค.
์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ
WHERE ์ ์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ํ๋ค.
์ค์ฒฉ ์๋ธ์ฟผ๋ฆฌ๋ ๋ณดํต ๋น๊ต์ฐ์ฐ์(=, <, >, ≤, ≥, <>, ≠)๋ฅผ ๋น๋กฏํด IN, EXISTS, NOT EXIST ๋ฌธ์ ๋ง์ด ์ฌ์ฉํ๋ค.
2.2.2 ๋ฉ์ธ์ฟผ๋ฆฌ์์ ๊ด๊ณ์ฑ์ ๋ฐ๋ฅธ SQL ์ฉ์ด
๋น์๊ด ์๋ธ์ฟผ๋ฆฌ Non Correlated Subquery
๋น์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์๋ธ์ฟผ๋ฆฌ ๊ฐ์ ๊ด๊ณ์ฑ์ด ์์์ ๋งํ๋ค.
์ฆ, ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ ์์ ์ผ๋ก ์คํ๋ ๋ค ๋ฉ์ธ์ฟผ๋ฆฌ์๊ฒ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋์ ธ์ฃผ๋ ํํ์ธ ๊ฒ์ด๋ค.
SELECT ...
FROM ํ์
WHERE ... IN (
SELECT ... FROM ์ง๋๊ต์ -- ๋น์๊ด ์ฟผ๋ฆฌ -> ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ฐ๊ด์ฑ ์์
)
-- ์คํ์์: ์๋ธ์ฟผ๋ฆฌ -> ๋ฉ์ธ์ฟผ๋ฆฌ
์๊ด ์๋ธ ์ฟผ๋ฆฌ Correlated Subquery
์๊ด ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์๋ธ์ฟผ๋ฆฌ ๊ฐ์ ๊ด๊ณ์ฑ์ด ์์์ ์๋ฏธํ๋ค.
์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ค๋ฉด ๋ฉ์ธ์ฟผ๋ฆฌ์ ๊ฐ์ ๋ฐ์์ผ ํจ์ผ๋ก ์๋ก ๊ด๊ณ๊ฐ ๊น๊ฒ ์ ์ง๋๋ค.
SELECT ...
FROM ํ์
WHERE ... IN (
SELECT ... FROM ์ง๋๊ต์ WHERE ํ์.ํ๋ฒ = ... -- ์๊ด ์ฟผ๋ฆฌ -> ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ํฅ์ ๋ฐ์ ํ์.ํ๋ฒ
)
-- ์คํ ์์: ๋ฉ์ธ์ฟผ๋ฆฌ -> ์๋ธ์ฟผ๋ฆฌ -> ๋ฉ์ธ์ฟผ๋ฆฌ
๋๋ฅ ์ตํฐ๋ง์ด์ ๋ฑ์ฅ!
์ฐ๋ฆฌ๋ ์๋ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ์ํด ์์ ๊ฐ์ด ์๋ธ์ฟผ๋ฆฌ๋ค์ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฟผ๋ฆฌ๋ ๊ฒฐ๊ตญ ์ตํฐ๋ง์ด์ ์ ์ํด ์คํ๊ณํ์ด ๊ฒฐ์ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ DB ๋ฒ์ ํน์ ์ตํฐ๋ง์ด์ ์ ๋ฐ๋ผ ์๋ธ์ฟผ๋ฆฌ๊ฐ ์ ๊ฑฐ๋๊ณ ํ๋์ ๋ฉ์ธ์ฟผ๋ฆฌ๋ก ํตํฉ๋๋ ๋ทฐ ๋ณํฉ(View Merging), ์ฆ SQL ์ฌ์์ฑ(rewrite)์ด ์๋ํ ์ ์๋ค.
2.2.3 ๋ฐํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ SQL ์ฉ์ด
๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ Single-Row Subquery
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ 1๊ฑด์ ํ์ผ๋ก ๋ฐํ๋๋ ์ฟผ๋ฆฌ์ด๋ค.
์ฃผ๋ก ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ค์คํ ์๋ธ์ฟผ๋ฆฌ Multiple-Row Subquery
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ๊ฑด์ ํ์ผ๋ก ๋ฐํ๋๋ ์ฟผ๋ฆฌ์ด๋ค.
SELECT ...
FROM ...
WHERE ํ๋ฒ IN (
SELECT MAX(ํ๋ฒ) FROM ํ์ GROUP BY ์ ๊ณต์ฝ๋
) -- ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
๋ค์ค์ด ์๋ธ์ฟผ๋ฆฌ Multiple-Column Subquery
์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ด๊ณผ ํ์ผ๋ก ๋ฐํ๋๋ ์ฟผ๋ฆฌ์ด๋ค.
SELECT ...
FROM ...
WHERE (์ด๋ฆ, ์ ๊ณต์ฝ๋) IN (
SELECT ์ด๋ฆ, ์ ๊ณต์ฝ๋ FROM ํ์ WHERE ์ด๋ฆ LIKE '๊น%'
) -- ๋ค์ค์ด ์๋ธ์ฟผ๋ฆฌ
2.2.4 ์กฐ์ธ ์ฐ์ฐ๋ฐฉ์ ์ฉ์ด
๋ค์์ ํ ์ด๋ธ์ ํฉ์ด์ ธ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ ๋ ์กฐ์ธ(Join) ๋ฐฉ์ ์ฌ์ฉ
๋ด๋ถ ์กฐ์ธ Inner Join
์์ชฝ์ ๋ชจ๋ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ง ๋ฐํ (๊ต์งํฉ)
-- ๋ช
์์ ์กฐ์ธ
SELECT ํ์.ํ๋ฒ, ํ์.์ด๋ฆ, ์ง๋๊ต์.๊ต์๋ช
FROM ํ์
INNER JOIN ์ง๋๊ต์
ON ํ์.ํ๋ฒ = ์ง๋๊ต์.ํ๋ฒ
-- ์์์ ์กฐ์ธ
SELECT ํ์.ํ๋ฒ, ํ์.์ด๋ฆ, ์ง๋๊ต์.๊ต์๋ช
FROM ํ์, ์ง๋๊ต์
WHERE ํ์.ํ๋ฒ = ์ง๋๊ต์.ํ๋ฒ
์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ Left Outer Join
์ผ์ชฝ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ์กฐ๊ฑด๊ณผ ์ผ์นํ์ง ์๋๋ผ๋ ์ผ์ชฝ ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ ์ต์ข ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค.
SELECT ํ์.ํ๋ฒ, ํ์.์ด๋ฆ, ์ง๋๊ต์.๊ต์๋ช
FROM ํ์
LEFT OUTER JOIN ๋๋ LEFT JOIN ์ง๋๊ต์
ON ํ์.ํ๋ฒ = ์ง๋๊ต์.ํ๋ฒ
์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ Right Outer Join
์กฐ์ธ ์กฐ๊ฑด๊ณผ ์ผ์นํ์ง ์๋๋ผ๋ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ ์ต์ข ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค.
SELECT ์ง๋๊ต์.ํ๋ฒ, ํ์.์ด๋ฆ, ์ง๋๊ต์.๊ต์๋ช
FROM ํ์
RIGHT OUTER JOIN ๋๋ RIGHT JOIN ์ง๋๊ต์
ON ํ์.ํ๋ฒ = ์ง๋๊ต์.ํ๋ฒ
LEFT JOIN vs RIGTH JOIN ์ฌ๋์ ์ธ์ง์ ํน์ฑ์ ๋ณดํต ์ผ์ชฝ → ์ค๋ฅธ์ชฝ์ ์ ๋ฐฉํฅ์ผ๋ก ์ธ์. ๋ฐ๋ผ์, LEFT JOIN์ ์ฃผ๋ก ์ฌ์ฉํ๊ฒ ๋จ. ์ผ๊ด๋ ์กฐ์ธ๋ฌธ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ ์ง๋ณด์๋ ๊ด๋ฆฌํธ์์ฑ ์ธก๋ฉด์์ ์ด์ ์ ์ป์
FULL OUTER JOIN์? FULL OUTER JOIN์ ๊ฒฝ์ฐ LEFT JOIN ๊ณผ RIGTH JOIN์ด ํตํฉ๋ ๋ฐฉ์์ผ๋ก MySQL๊ณผ MariaDB์์๋ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋ค.
๊ต์ฐจ ์กฐ์ธ Cross Join
๊ต์ฐจ ์กฐ์ธ์ ๋ฐ์นด๋ฅดํธ ๊ณฑ(cartesian product) ๊ณฑ์งํฉ ๊ฐ๋ , ์กฐ์ธ์ ์ฐธ์ฌํ๋ ํ ์ด๋ธ์์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์กฐํฉ์ ์ฐพ์๋ด์ด ๋ฐํ.
-- ๋ช
์์ ์กฐ์ธ
SELECT ํ์.ํ๋ฒ, ํ์.์ด๋ฆ, ์ง๋๊ต์.ํ๋ฒ, ์ง๋๊ต์.๊ต์๋ช
FROM ํ์
CROSS JOIN ์ง๋๊ต์
-- ์์์ ์กฐ์ธ
SELECT ํ์.ํ๋ฒ, ํ์.์ด๋ฆ, ์ง๋๊ต์.ํ๋ฒ, ์ง๋๊ต์.๊ต์๋ช
FROM ํ์, ์ง๋๊ต์
-- ์์์ ์กฐ์ธ์ ๊ฒฝ์ฐ WHERE ์ ์ ์กฐ์ธ ์กฐ๊ฑด๋ฌธ์ด๋
-- JOIN ํค์๋๋ฅผ ๋ช
์ํ์ง ์๊ณ ์์ฑํ๋ฉด CROSS JOIN์ด ๋๋ค.
์์ฐ ์กฐ์ธ Natural Join
2๊ฐ ํ ์ด๋ธ์ ๋์ผํ Column ์ด๋ฆ์ด ์์ ๋ ์กฐ๊ฑด์ ๋ฐ๋ก ์์ฑํ์ง ์์๋ ์กฐ์ธ์ด ๋๋ ๋ฐฉ์.
SELECT ํ์.*, ์ง๋๊ต์.*
FROM ํ์
NATURAL JOIN ์ง๋๊ต์
๋จ, ๋์ผํ Column ์ด๋ฆ์ด ์กด์ฌํ์ง ์์๊ฒฝ์ฐ Cross Join๋ฐ์.
๊ทธ๋ผ ๋ฌด์จ ์กฐ์ธ ์ฌ์ฉํ ๊น?
๋ช ์์ INNER JOIN ํน์ LEFT OUTER JOIN ๋ฌด์กฐ๊ฑด์ด๋ค.
๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ฌ.
2.2.5 ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ ์ฉ์ด
๋๋ผ์ด๋น ํ ์ด๋ธ(Driving table)๊ณผ ๋๋ฆฌ๋ธ ํ ์ด๋ธ(Driven table)
๋๋ผ์ด๋น ํ ์ด๋ธ == ๋จผ์ ์ ๊ทผํ๋ ํ ์ด๋ธ
๋๋ฆฌ๋ธ ํ ์ด๋ธ == ๋ค ๋ฆ๊ฒ ์ ๊ทผํ๋ ํ ์ด๋ธ
SELECT ํ์.ํ๋ฒ, ํ์.์ด๋ฆ, ๋น์์ฐ๋ฝ๋ง.๊ด๊ณ, ๋น์์ฐ๋ฝ๋ง.์ฐ๋ฝ์ฒ
FROM ํ์
JOIN ๋น์์ฐ๋ฝ๋ง
ON ํ์.ํ๋ฒ = ๋น์์ฐ๋ฝ๋ง. ํ๋ฒ
WHERE ํ์.ํ๋ฒ IN(1, 100)
-- ๋๋ผ์ด๋น ํ
์ด๋ธ == ํ์
-- ๋๋ฆฌ๋ธ ํ
์ด๋ธ == ๋น์์ฐ๋ฝ๋ง
๊ฐ๋ฅํ๋ฉด ์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ ๊ฒ์ผ๋ก ์์๋๋ ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ ์ .
์กฐ์ธ ์กฐ๊ฑด์ ์ ์ด์ด ์ธ๋ฑ์ค๋ก ์ค์ ๋๋๋ก ๊ตฌ์ฑ.
์ค์ฒฉ ๋ฃจํ ์กฐ์ธ Nested Loop Join, NL Join
์ค์ฒฉ ๋ฃจํ ์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ์ ๋ฐ์ดํฐ 1๊ฑด๋น ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ๋ณตํด ๊ฒ์ํ๋ฉฐ ์ต์ข ์ ์ผ๋ก ์์ชฝ ํ ์ด๋ธ์ ๊ณตํต๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ค. (๋๋ผ์ด๋น ํ ์ด๋ธ N * ๋๋ฆฌ๋ธ ํ ์ด๋ธ M)
SELECT ...
FROM ํ์
JOIN ๋น์์ฐ๋ฝ๋ง
ON ํ์.ํ๋ฒ = ๋น์์ฐ๋ฝ๋ง.ํ๋ฒ
WHERE ํ์.ํ๋ฒ IN(1, 100)
--
-- ๋๋ผ์ด๋น ํ
์ด๋ธ ๊ฒฐ๊ณผ๋ 1๊ณผ 100 2๊ฐ
-- ๋๋ฆฌ๋ธ ํ
์ด๋ธ ๋น์์ฐ๋ฝ๋ง์ ํ
์ด๋ธ์ด ๋ง์ฝ 1000๊ฑด์ด๋ผ๊ณ ํ๋ฉด
-- ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ต์
2000๊ฑด์ ๋ฐ์ดํฐ ์ ๊ทผ์ด ์ผ์ด๋๊ฒ ๋จ.
-- ๋ง์ฝ, ์กฐ์ธ ์กฐ๊ฑด์ ์ด ๋ชจ๋ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค์๋ค๋ฉด == ํ์ ํ
์ด๋ธ ํ๋ฒ ์ปฌ๋ผ ์ธ๋ฑ์ค, ๋น์์ฐ๋ฝ๋ง ํ๋ฒ ์ปฌ๋ผ ์ธ๋ฑ์ค
-- ๋๋ฆฌ๋ธ ํ
์ด๋ธ ๋น์์ฐ๋ฝ๋ง ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ์ธ๋ฑ์ค๋ง ์ ๊ทผ.
-- ๋ฐ์ดํฐ ์ ๊ทผ ํ์ ๊ฐ์.
์ธ๋ฑ์ค๋ ์ธ๋ฑ์ค๋ก ์ ์๋ ์ด ๊ธฐ์ค์ผ๋ก ์์ฐจ ์ ๋ ฌ๋์ง๋ง, ํด๋น ์ธ๋ฑ์ค๊ฐ ๋น๊ณ ์ ์ธ๋ฑ์ค์ผ ๊ฒฝ์ฐ
์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์์ ์์ ์ ๊ทผ ๋ฐฉ์์ธ ๋๋ค ์ก์ธ์ค(Random Access)๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์, ๋๋ค ์ก์ธ์ค๋ฅผ ์ค์ผ ์ ์๋๋ก ๋ฐ์ดํฐ์ ์ก์ธ์ค ๋ฒ์๋ฅผ ์ขํ๋ ๋ฐฉํฅ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ๊ณ ์กฐ๊ฑด์ ์ ์์ฑํด์ผ ํ๋ค.
๊ธฐ๋ณธ ํค๋ ํด๋ฌ์คํฐํ ์ธ๋ฑ์ค์ด๋ฏ๋ก ๊ธฐ๋ณธ ํค์ ์์๋๋ก ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฌ๋์ด ์์ด ์กฐํ ํจ์จ์ด ๋งค์ฐ ๋๋ค.
๋ธ๋ก ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ Block Nested Loop Join, BNL Join
์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค์์ง ์๋ ์ํฉ์ ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฑ์ฅ.
- **์กฐ์ธ ๋ฒํผ(Join Buffer)**์ ๋๋ผ์ด๋น ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ฅผ ์กฐ์ธ ๋ฒํผ๊ฐ ๊ฐ๋ ์ฐฐ๋๊น์ง ์ ์ฌ.
- ์กฐ์ธ ๋ฒํผ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํ๋ ์์ผ๋ก ๋ฐ๋ณต.
ํด๋น ๊ณผ์ ์ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ํ ์ค์บ์ ์ค์ด๋ ๊ฒ ๋ชฉ์ ์ด๋ค.
๋๋ผ์ด๋น ํ ์ด๋ธ Full Scan → ๋๋ฆฌ๋ธ ํ ์ด๋ธ Full Scan ๋ฐ๋ณต์ ์ต์ํ ์ํฌ ์ ์๋ค.
๋ฐฐ์น ํค ์์ธ์ค ์กฐ์ธ Batched Key Access Join(BKA ์กฐ์ธ)
์ค์ฒฉ ๋ฃจํ ์กฐ์ธ ๋ฐฉ์์ ์ธ๋ฑ์ค์ ๋๋ค ์์ธ์ค์ ๋จ์ ์ ํด๊ฒฐํ๊ณ ์,
์ ๊ทผํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์์ํ๊ณ ๊ฐ์ ธ์ค๋๋ฐ ์ฐฉ์๋ ์กฐ์ธ ์๊ณ ๋ฆฌ์ฆ.
๋ธ๋ก ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ ๋ฐฉ์์ ์กฐ์ธ ๋ฒํผ ๊ฐ๋ ์ ์ฌ์ฉํ๊ณ , ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ ์ ๋ ฌ๋ ์ํ๋ก ๋ด๋ ๋๋ค ๋ฒํผ์ ๊ฐ๋ ์ด ์ถ๊ฐ๋์๋ค.
์ด๋, ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ๊ณ ์ ๋ ฌ๋ ์ํ๋ก ๋ฒํผ์ ์ ์ฌํ๋ ๊ธฐ๋ฅ์ **๋ค์ค ๋ฒ์ ์ฝ๊ธฐ(Multi Range Read, MRR)**๋ผ๊ณ ํ๋ค.
๋ฏธ๋ฆฌ ์์ธก, ์ ๋ ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ก์ธ์ค ํ๊ธฐ ๋๋ฌธ์ ๋๋ค ์ก์ธ์ค๊ฐ ์๋ ์ํ์ ์ก์ธ์ค๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
ํด์ ์กฐ์ธ Hash Join
MySQL 8.0.18 ๋ฒ์ ๋ถํฐ ์ง์๋๋ ๋ฐฉ์.(์์ฉ DMBS ์ค๋ผํด ๊ฐ์ ์ ๋ค์ ์ด๋ฏธ ์ง์ํ๊ณ ์์๋ค๊ณ ํ๋ค.)
๋ธ๋ก ์ค์ฒฉ ๋ฃจํ ์กฐ์ธ๊ณผ ๋ฐฐ์น ํค ์ก์ธ์ค ์กฐ์ธ์ ํ๊ณ๋ฅผ ํํผํ๊ธฐ ์ํจ.
์กฐ์ธ์ ์ฐธ์ฌํ๋ ๊ฐ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ํด์๊ฐ์ผ๋ก ๋ง๋ค์ด ๋ด๋ถ ์กฐ์ธ์ ์ํํ๋ค.
๋ด๋ถ ์กฐ์ธ ์ํ ๊ฒฐ๊ณผ๋ ์กฐ์ธ ๋ฒํผ์ ์ ์ฅ๋๋ฏ๋ก ์กฐ์ธ์ด์ ์ธ๋ฑ์ค๋ฅผ ํ์๋ก ์๊ตฌํ์ง ์์๋ ๋๋ค.
2.3.1 ๊ธฐ์ด ์ฉ์ด - ์ค๋ธ์ ํธ ์ค์บ ์ ํ
ํ ์ด๋ธ ํ ์ค์บ Table Full Scan
ํ ์ด๋ธ ํ ์ค์บ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑฐ์น์ง ์๊ณ ํ ์ด๋ธ๋ก ๋ฐ๋ก ์งํํ์ฌ ์ฒ์๋ถํฐ ๋๊น์ง ๋ฐ์ดํฐ๋ฅผ ํ์ด๋ณด๋ ๋ฐฉ์.
ํ ์ด๋ธ ํ ์ค์บ์ ์ธ๋ฑ์ค ์์ด ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ์. ์ฑ๋ฅ ์ธก๋ฉด์์๋ ๋ถ์ ์ .
์ธ๋ฑ์ค ๋ฒ์ ์ค์บ Index Range Scan
์ธ๋ฑ์ค ๋ฒ์ ์ค์บ์ ์ธ๋ฑ์ค๋ฅผ ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ค์บํ ๋ค ์ค์บ ๊ฒฐ๊ณผ๋ฅผ ํ ๋๋ก ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ์.
์ข์ ๋ฒ์๋ฅผ ์ค์บํ ๋ ๋งค์ฐ ํจ์จ์ , ๋์ ๋ฒ์์ ๊ฒฝ์ฐ ๋นํจ์จ์ ์ธ ๋ฐฉ์
SQL์ BETWEEN ~ AND, <, >, LIKE ๊ตฌ๋ฌธ ๋ฑ์ ์ฌ์ฉ๋จ.
์ธ๋ฑ์ค ํ ์ค์บ Index Full Scan
์ธ๋ฑ์ค ํ ์ค์บ์ ์ธ๋ฑ์ค๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ค์บํ๋ ๋ฐฉ์.
๋จ, ํ ์ด๋ธ์ ์ ๊ทผํ์ง ์๊ณ ์ธ๋ฑ์ค๋ก ๊ตฌ์ฑ๋ ์ด ์ ๋ณด๋ง ์๊ตฌํ๋ SQL ๋ฌธ์์ ์ธ๋ฑ์ค ํ ์ค์บ์ด ์ํ๋จ.
ํ ์ด๋ธ ํ ์ค์บ๋ณด๋ค๋ ์ฑ๋ฅ ์ข์.
๊ทธ๋ฌ๋, ์ต๋ํ ๊ฒ์ ๋ฒ์๋ฅผ ์ค์ด๋ ๋ฐฉํฅ์ผ๋ก SQL ํ๋ ๊ถ์ฅ.
์ธ๋ฑ์ค ๊ณ ์ ์ค์บ Index Unique Scan
์ธ๋ฑ์ค ๊ณ ์ ์ค์บ์ ๊ธฐ๋ณธ ํค๋ ๊ณ ์ ์ธ๋ฑ์ค๋ก ํ ์ด๋ธ์ ์ ๊ทผํ๋ ๋ฐฉ์.
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ์ค์บ ๋ฐฉ์ ์ค ๊ฐ์ฅ ํจ์จ์ ์ธ ์ค์บ ๋ฐฉ๋ฒ.
WHERE ๊ธฐ๋ณธ ํค ํน์ ๊ณ ์ ์ธ๋ฑ์ค ์ปฌ๋ผ = ์กฐ๊ฑด ์ผ๋ก ๋์ด ์์ ๊ฒฝ์ฐ ํ์ฉ๋จ.
์ธ๋ฑ์ค ๋ฃจ์ค ์ค์บ Index Loose Scan
์ธ๋ฑ์ค ๋ฃจ์ค ์ค์บ์ ์ธ๋ฑ์ค์ ํ์ํ ๋ถ๋ถ๋ค๋ง ๊ณจ๋ผ ์ค์บํ๋ ๋ฐฉ์.
ํ์ํ ๋ฐ์ดํฐ์ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ ๋ค ๋ถํ์ํ ์ธ๋ฑ์ค ํค๋ ๋ฌด์.
GROUP BY , MAX(), MIN() ํจ์์ ๊ฒฝ์ฐ ์๋.
์ธ๋ฑ์ค ๋ณํฉ ์ค์บ Index Merge Scan
์ธ๋ฑ์ค ๋ณํฉ ์ค์บ์ ํ ์ด๋ธ ๋ด์ ์์ฑ๋ ์ธ๋ฑ์ค๋ค์ ํตํฉํด์ ์ค์บํ๋ ๋ฐฉ์.
์ตํฐ๋ง์ด์ ๊ฐ ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์ ๊ฒฐํฉ(Union)๊ณผ ๊ต์ฐจ(Intersection) ๋ฐฉ์์ ํตํด ์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ์คํํ๋ฉฐ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์.
๊ฐ๋ณ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ์ํํ๋ฏ๋ก ์ธ๋ฑ์ค์ ์ ๊ทผํ๋ ์๊ฐ์ด ๋ช ๋ฐฐ๋ก ๊ฑธ๋ฆผ.
๋ฐ๋ผ์, ๋ณ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ํ๋์ ์ธ๋ฑ์ค๋ก ํตํฉ ํน์ SQL๋ฌธ ์์ฒด๋ฅผ ๋ ๋ฆฝ๋ ํ๋์ ์ธ๋ฑ์ค๋ง ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ
2.3.1 ๊ธฐ์ด ์ฉ์ด - ๋์คํฌ ์ ๊ทผ ๋ฐฉ์
์ํ์ ์ก์ธ์ค Sequential Access
์ธ์ ํ ํ์ด์ง๋ฅผ ์ฐจ๋ก๋๋ก ์ฝ๋ ์์ฐจ ์ ๊ทผ ๋ฐฉ์, ํ ์ด๋ธ ํ ์ค์บ์์ ํ์ฉ๋จ.
๋๋ค ์ก์ธ์ค Random Access
๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์ด์ง ํ์ด์ง๋ค์ ์์ ์ ๊ทผ ๋ฐฉ์.
๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์ด์ง ํ์ด์ง์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋์คํฌ ํค๋๊ฐ ์์ง์ด๋ ๋น์ฉ์ด ๋ณด๋ค ํผ.
์ ๊ทผ ๋ฒ์๋ฅผ ์ค์ด๊ณ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์๋๋ก ํ๋ํด์ผ ํจ.
2.3.1 ๊ธฐ์ด ์ฉ์ด - ์กฐ๊ฑด ์ ํ
์์ธ์ค ์กฐ๊ฑด Access Condition
๋์คํฌ์ ์๋ ๋ฐ์ดํฐ์ ์ด๋ป๊ฒ ์ ๊ทผํ ๊ฒ์ธ์ง๋ฅผ ๋ค๋ฃจ๋ SQL ํ๋์ ํต์ฌ.
์ตํฐ๋ง์ด์ ๋ WHERE ์ ์ ํน์ ์กฐ๊ฑด๋ฌธ์ ์ด์ฉํด ์๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ธ๋ฑ์ค๋ฅผ ํตํด ์๊ฐ ๋ญ๋น๋ฅผ ์ค์ด๋ ์กฐ๊ฑด์ ์ ์ ํํ์ฌ, ์คํ ๋ฆฌ์ง ์์ง์ ์ ๊ทผํ๊ณ MySQL ์์ง์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
SELECT *
FROM TAB
WHERE ID = 1
AND CODE ='A';
-- ID ์ปฌ๋ผ ์ธ๋ฑ์ค O, CODE ์ปฌ๋ผ ์ธ๋ฑ์ค X
์ตํฐ๋ง์ด์ ๋ ์์ ๊ฐ์ ๊ฒฝ์ฐ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ ID ์ปฌ๋ผ์ ํตํด ๋์คํฌ์ ์ ๊ทผํ๋ค.
์ด๊ฒ ์์ธ์ค ์กฐ๊ฑด์ด๋ค.
ํํฐ ์กฐ๊ฑด Filter Condition
์์ธ์ค ์กฐ๊ฑด์ ์ด์ฉํด MySQL ์์ง์ผ๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ถ๊ฐ๋ก ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๊ฐ๊ณตํ๋ ์กฐ๊ฑด.
ํํฐ ์กฐ๊ฑด์ผ๋ก ํํฐ๋ง๋์ด ์ ๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ ์กด์ฌ ํ ์๋ก ํจ์จ์ด ์ข์ง ์๋ค.
์คํ ๋ฆฌ์ง์์ MySQL ์์ง์ผ๋ก ๋๊ธฐ๋ ๋ฐ์ดํฐ์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ.
์ ๊ฑฐ๋ ๋ฐ์ดํฐ๋ผ๋ฉด ์คํ ๋ฆฌ์ง ์์ง์ ์ ๊ทผํ๋ ๊ณผ์ ์์ ๊ฐ์ด ์ ์ธ๋๋ ํธ์ด ํจ์จ์
SELECT *
FROM TAB
WHERE ID = 1
AND CODE ='A'; -- CODE = 'A' ์ด๊ฒ ํํฐ ์กฐ๊ฑด์.
2.3.2 ์์ฉ ์ฉ์ด
์ ํ๋ Selectivity
ํ ์ด๋ธ์ ํน์ ์ด์ ๊ธฐ์ค์ผ๋ก ํด๋น ์ด์ ์กฐ๊ฑด์ ์ ๋ฐ๋ผ ์ ํ๋๋ ๋ฐ์ดํฐ ๋น์จ
๋ฎ์ ์ ํ๋๋ฅผ ๊ฐ์ง๋ ์ด์ ์ธ๋ฑ์ค ์์ฑํ ๋ ์ฃผ์ ๊ณ ๋ ค ๋์
์ ํ๋ = ์ ํํ ๋ฐ์ดํฐ ๊ฑด์ / ์ ์ฒด ๋ฐ์ดํฐ ๊ฑด์
๋ณํ๋ ์ ํ๋ = 1 / DISTINCT(COUNT COLUMN_NAME) -- ๋ณดํต ์ค๋ณต์ด ์ ๊ฑฐ๋ ๋ฐ์ดํฐ์ ๊ฑด์๋ฅผ ํ์ฉํจ.
-- ์์ ํ๋ฒ
-- ์ด 100๋ช
์ ํ์ ์ค ํ๋ฒ์ ํตํด ํ์์ ์ฐพ๋ ๊ฒฝ์ฐ
ํ๋ฒ ์ด์ ์ ํ๋ = 1 / 100 = 0.01 -- ๋ฎ์ ์ ํ๋
-- ์์ ์ฑ๋ณ
-- ์ด 100๋ช
์ ํ์ ์ค ์ฑ๋ณ์ ํตํด ํ์์ ์ฐพ๋ ๊ฒฝ์ฐ
์ฑ๋ณ ์ด์ ์ ํ๋ = 50 / 100 = 0.5 -- ๋์ ์ ํ๋
์นด๋๋๋ฆฌํฐ Cardinality
์ฌ์ ์ ์ ์๋ ํ๋์ ๋ฐ์ดํฐ ์ ํ์ผ๋ก ์ ์๋๋ ๋ฐ์ดํฐ ํ์ ๊ฐ์.
ํ์ ์์๋ ์ ์ฒด ํ์ ๋ํ ํน์ ์ด์ ์ค๋ณต ์์น๋ฅผ ๋ํ๋ด๋ ์งํ๋ก ์ฌ์ฉ.
์ค๋ณต๋๋ ๊ฐ์ด ์ ๋ค๋ฉด ์นด๋๋๋ฆฌํฐ ๋์
์ค๋ณต๋๋ ๊ฐ์ด ๋ง์ผ๋ฉด ์นด๋๋๋ฆฌํฐ ๋ฎ์
์นด๋๋๋ฆฌํฐ = ์ ์ฒด ๋ฐ์ดํฐ ๊ฑด์ * ์ ํ๋
-- ์์
-- ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ: ์นด๋๋๋ฆฌํฐ ๋์
-- ์ด๋ฆ: ์นด๋๋๋ฆฌํฐ ์ค๊ฐ
-- ์ฑ๋ณ: ์นด๋๋๋ฆฌํฐ ๋ฎ์
ํํธ Hint
์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋นจ๋ฆฌ ์ฐพ์ ์ ์๋๋ก ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๊ฒ
-- ์ฃผ์์ฒ๋ผ ํํธ ๋ช
์ํ๋ ๋ฒ
SELECT ํ๋ฒ, ์ ๊ณต์ฝ๋
FROM ํ์ /*! USE INDEX (ํ์_IDX01) */
WHERE ์ด๋ฆ = '์ ์ฌ์';
-- ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ก ์์ฑ
SELECT ํ๋ฒ, ์ ๊ณต์ฝ๋
FROM ํ์ USE INDEX (ํ์_IDX01)
WHERE ์ด๋ฆ = '์ ์ฌ์';
๋จ, ์ตํฐ๋ง์ด์ ๊ฐ ์ฐ๋ฆฌ์ ํํธ๋ฅผ ๋ฌด์กฐ๊ฑด ์ฐธ๊ณ ํ๋๊ฑด ์๋๋ค. ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐ๋๋ฉด ์์งค ์๋ค. (๊ณผ์ฐ ๋ด๊ฐ ์ตํฐ๋ง์ด์ ๋ณด๋ค ๋ฐ์ด๋ ๊น?)
ํํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ณ๋์ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
์ด๋ ํน์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ํํธ๋ฅผ ๊ด๋ฆฌํ๋ค๊ฐ ๊ทธ ์ธ๋ฑ์ค๋ฅผ ์ญ์ ํ๊ฒ ๋๋ค๋ฉด ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ์๋น์ค ์ฅ์ ๊ฐ ๋๋ค.
์ฝ๋ ์ด์ Collation
ํน์ ๋ฌธ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ์ ๋ ฌํ๋ ๊ท์น.
-- ์์
utf8_bin: A > B > a > b
utf8_general_ci: A > a > B > b
๊ทธ๋ผ ์บ๋ฆญํฐ ์ (Character Set)์ด๋ ๋ญ๊ฐ ๋ค๋ฆ? ์บ๋ฆญํฐ ์ == ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ฅ ํ ๊ฒ์ธ์ง์ ๋ํ ๊ท์น ์ฝ๋ ์ด์ == ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋น๊ตํ ๊ฒ์ธ์ง์ ๋ํ ๊ท์น
'๐ ์ฑ > ์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ฌด์ ๋ฐ๋ก ์ฐ๋ SQL ํ๋ 1์ฅ MySQL๊ณผ MariaDB ๊ฐ์ (0) | 2024.11.03 |
---|