DeepDive ์ฃผ์
๐ก ์ตํฐ๋ง์ด์ (Optimizer)์ ๋ํด ์์ ํ์์ค.
์ฃผ์ ๋ฅผ ๋ณด๊ณ ๋ ์๊ฐ
- ์ตํฐ๋ง์ด์ ? ์ต์ ํ? ์ฟผ๋ฆฌ ์ต์ ํ ๋งํ๋๊ฑด๊ฐ?
- ์ฟผ๋ฆฌ์กฐํํ๋ ์๊ฐ์ ์ค์ฌ์ ์ฑ๋ฅ๋์ผ๋ ค๊ณ ์ฐ๋๊ฑฐ ์๋๊ฐ?
- mysql, oracle ๋ฑ DB์์ง๋ง๋ค ๋ค๋ฅด๊ฒ ๋์ํ๋๊ฑด๊ฐ?
๐ SQL ์ต์ ํ vs ์ฟผ๋ฆฌ ์ต์ ํ vs DB ์ต์ ํ
- SQL ์ต์ ํ = ์ฟผ๋ฆฌ ์ต์ ํ โ ์ด๋ฒ ๋ฅ๋ค์ด๋ธ ์ฃผ์
- DB ์ต์ ํ โ SQL ์ต์ ํ๋ฅผ ํฌํจํ๋ ๋ ๋์ ๊ฐ๋
, DB์ ์ฒด์ ๊ตฌ์กฐ์ ์ต์ ํ(์คํ ๋ฆฌ์ง ์์ง/์บ์ฑ/๋ฒํผ ํ๋, ํํฐ์
๋, ์ค๋ฉ ๋ฑ ๊ตฌ์กฐ์ ์ต์ ํ)
์ตํฐ๋ง์ด์ (optimizer, ์ต์ ํ)๋?
- ์ฌ์ฉ์๊ฐ ์์ฑํ SQL ๋ฌธ์ฅ์ ์ค์ ๋ก ์ด๋ป๊ฒ ์คํํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ย ์คํ ๊ณํ(Execution Plan)์ ์์ฑํ๋ DBMS ๋ด๋ถ ๊ตฌ์ฑ ์์
- Why use?
-
๊ฐ์ SQL์๋ ์คํ ๋ฐฉ๋ฒ์ด ์ฌ๋ฌ๊ฐ์ง์
-
๋ฐ์ดํฐ ์/๋ถํฌ์ ๋ฐ๋ผ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง
-
์์ ๊ฒ์ ๋ค ๊ณ ๋ คํ์ฌ SQL๋ง๋ค ์ฌ๋์ด ์คํ๊ณํ์ ์ง์ ๊ณ ๋ฅด๊ธฐ๋ ๋ถ๊ฐ๋ฅ!
โ ์ฆ, DBMS๊ฐ ์๋์ผ๋ก ์ต์ ์ ์คํ ๊ณํ์ ๊ณจ๋ผ ์ ์ผ ํจ์จ์ด ์ข์ ์คํ๊ณํ์ ๊ณจ๋ผ์ค
์ฟผ๋ฆฌ ์คํ ์ ์ฐจ
๐ก SQL Parsing > Optimization + Generation > Execution

- SQL Parsing
- ์ฌ์ฉ์๋ก๋ถํฐ ์์ฒญ๋ SQL๋ฌธ์ฅ์ ์ชผ๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ํ์
ํ๊ณ ์ด๋ฅผ ๋ถ๋ฆฌํ์ฌ ํ์ค ํธ๋ฆฌ๋ฅผ ๋ง๋ฌ
- SQL๋ฌธ์ฅ์ด ๋ฌธ๋ฒ์ ์ผ๋ก ์๋ชป๋๋ค๋ฉด ์ด ๋จ๊ณ์์ ๊ฑธ๋ฌ์ง
- Optimization + Generation (์ต์ ํ ๋ฐ ์คํ ๊ณํ ์๋ฆฝ)
- ํ์คํธ๋ฆฌ ์ฐธ์กฐํ๋ฉด์ ์กฐ์ธ์์, ์ธ๋ฑ์ค ์ฌ์ฉ ์ ๋ฌด ๋ฑ ๋ค์ํ ์กฐํฉ์ ๊ณ ๋ คํ๋ฉฐ ์คํ๊ณํ ์ธ์ฐ๊ณ ์์ง์ด ์ค์ ๋ก ์คํํ ์ ์๋ ์ฝ๋๋ ํ๋ก์์ ํํ๋ก ํฌ๋งทํ
- Execution
- 2๋ฒ์์ ๊ฒฐ์ ๋ ์คํ๊ณํ(ํ
์ด๋ธ์ ์ฝ๊ธฐ ์์, ์ ํ๋ ์ธ๋ฑ์ค ๋ฑ)๋๋ก ์คํ ๋ฆฌ์ง ์์ง์ ๋ ์ฝ๋๋ฅผ ์ฝ์ด์ค๊ณ ์คํํ์ฌ ์ฌ์ฉ์์๊ฒ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ
์ตํฐ๋ง์ด์ ์ ์ข
๋ฅ
- ๊ท์น ๊ธฐ๋ฐ ์ต์ ํ(RBO : Rule-Based Optimizer) โ ์์ ์ด๊ธฐ ๋ฒ์ ์ ์ค๋ผํด์์ ์ฌ์ฉ
- ์ตํฐ๋ง์ด์ ์ ์ด๋ฏธ ๋ด์ฅ๋ ์ฐ์ ์์์ ๋ฐ๋ผ ์คํ๊ณํ์ ์๋ฆฝํ๋ ๋ฐฉ์
- ํต๊ณ์ ๋ณด(ํ
์ด๋ธ ๋ ์ฝ๋ ๊ฑด์, ์ปฌ๋ผ๊ฐ์ ๋ถํฌ๋ ๋ฑ)์ ์กฐ์ฌ X โ ๊ฐ์ ์ฟผ๋ฆฌ์ ๊ฑฐ์๊ฐ์ ์คํ๋ฐฉ๋ฒ ๋ง๋ค์ด๋ โ But, ์ฌ์ฉ์์ ๋ฐ์ดํฐ ๋ถํฌ๋๋ ๋งค์ฐ ๋ค์ํ๊ธฐ์ ์ด๋ฏธ ์ค๋์ ๋ถํฐ ์ฌ์ฉX
- ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ๋ RBO์ ์ฐ์ ์์

- ๋น์ฉ ๊ธฐ๋ฐ ์ต์ ํ(CBO : Cost-Based Optimizer) โ ํ์ฌ ๋๋ถ๋ถ์ RDBMS๊ฐ ์ฌ์ฉ
- ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ๋ค์ ๊ฐ ๋จ์ ์์
๋น์ฉ(๋ถํ) ์ ๋ณด์ ๋์ ํ
์ด๋ธ์ ์์ธก๋ ํต๊ณ์ ๋ณด๋ฅผ ์ด์ฉํด ์คํ ๊ณํ๋ณ ๋น์ฉ์ ์ฐ์ถํ์ฌ ๋น์ฉ์ด ์ต์์ธ ๋ฐฉ์์ ์ ํํด์ฌ ์คํํ๋ ๋ฐฉ๋ฒ
๐ค ๊ฒฐ๊ตญ ์ตํฐ๋ง์ด์ ๋ DBMS ๋ด๋ถ ์์ง์ผ๋ก ๋ด๊ฐ ๊ฑด๋ค ์ ์๋๋ฐ ์ ์์์ผํ ๊น?
- ์ตํฐ๋ง์ด์ ๊ฐ ์คํ๊ณํ์ ์๋์ผ๋ก ๊ณ ๋ฅด์ง๋ง ํญ์ ์ต์ ์ ์๋! โ ๊ทธ ์คํ๊ณํ์ ์ฐ๋ฆฌ๊ฐ ์ฝ์ ์ค ์์์ผ ์ํฉ์ ๋ง๋ ์ฟผ๋ฆฌ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ โ ์ฆ, ์ฟผ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ์ง๋๋, ์ธ๋ฑ์ค๋ฅผ ์ด๋ป๊ฒ ๋๋๋์ ๋ฐ๋ผ ์ตํฐ๋ง์ด์ ์ ์ ํ์ด ๋ฌ๋ผ์ง(์ฑ๋ฅ์ด ๋ฌ๋ผ์ง)
- ex) Like ์ฌ์ฉ์ ์ธ๋ฑ์ค ํ๋์ ์ํ๋
SELECT * FROM member WHERE name LIKE '%์ ์ง';
SELECT * FROM member WHERE name LIKE 'ํ%';
๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- DB๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ป๊ฒ ์ฝ๊ณ , ์กฐ์ธํ๊ณ , ์ ๋ ฌํ ๊น?
1. ํ ํ
์ด๋ธ ์ค์บ vs ํ ์ธ๋ฑ์ค ์ค์บ
- ํ ํ
์ด๋ธ ์ค์บ : ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ฝ์
- ํ
์ด๋ธ์ ๋ ์ฝ๋ ๊ฑด์ ์์๋
- Where์ ์ด๋ On์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๋ ์ ์ ํ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ
- ex ) SELECT * FROM member;
- ํ ์ธ๋ฑ์ค ์ค์บ : ํ
์ด๋ธ์ ์ง์ ์ฝ์ง ์๊ณ , ์ธ๋ฑ์ค๋ง ๋๊น์ง ์ฝ์
- SELECT ์ปฌ๋ผ์ด ์ ๋ถ ์ธ๋ฑ์ค์ ํฌํจ๋ ๋(covering index) ์ ๋ฆฌ.
- ex ) SELECT count(*) FROM member;
- ๋จ์ํ ๊ฐ์๋ง ์ธ๋๊ฒ์ด๋ผ ํํ
์ด๋ธ๋ณด๋ค๋ ์ฉ๋์ด ์์ ํ ์ธ๋ฑ์ค ์ค์บ์ ์ ํํ ํ๋ฃ์ด ๋์
- ๋ฆฌ๋ ์ดํค๋ : ํ ์ค์บ์ ํ ๊ฒฝ์ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ํ ์ค์บํ ๋ ์์๋๋ก ํ๋์ฉ ์ฝ์ด๋๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ๋ฏธ๋ฆฌ ์ฝ์ด์ ๋ฒํผํ์ ๊ฐ์ ธ๋ค ๋๋๊ฒ.
- InnoDB ์คํ ๋ฆฌ์์ง์์ ์ฌ์ฉ
- ์ฌ๊ธฐ์ ๋งํ๋ ํ์ค์บ = ํ ํ
์ด๋ธ, ํ์ธ๋ฑ์ค ๋ชจ๋๋ฅผ ์ผ์ปซ๋๋ง
๐ก ์๋น์ค ์ค๊ณ ๊ด์
- โ์๊ท๋ชจ ํ
์ด๋ธโ โ ํ์ค์บ ๊ด์ฐฎ์
- โ์์ฃผ ๊ฒ์/์ ๋ ฌ๋๋ ์ปฌ๋ผโ โ ์ธ๋ฑ์ค ์ฃผ๊ธฐ
2. ๋ณ๋ ฌ์ฒ๋ฆฌ
- ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋๋์ด ์ฒ๋ฆฌํ๋ ๊ฒ
- ์๋ฌด๋ฐ ์กฐ๊ฑด ์์ด ๋จ์ํ ํ
์ด๋ธ์ ์ ์ฒด ๊ฑด์๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ๋ง ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๊ฐ๋ฅ
- ์ค๋ ๋ ๊ฐ์๊ฐ ๋ง์์๋ก ์ฟผ๋ฆฌ์ฒ๋ฆฌ์๊ฐ์ ์ค๊ฒ ์ง๋ง, CPU์ฝ์ด ๊ฐ์๋ฅผ ๋์ด์๋ ๊ฒฝ์ฐ์๋ ์คํ๋ ค ์ฑ๋ฅ์ ํ
- ex) SET SESSION innodb_parallel_read_threads=2;
๐ก์๋น์ค ์ค๊ณ ๊ด์
- ๋ณดํต MySQL ๋จ๋
๋ณด๋จ DW/OLAP(๋ถ์์ฉ) DB์์ ํ์ฉ ๊ฐ์น โ
- ์ผ๋ฐ ์น์๋น์ค ํธ๋์ญ์
์ฑ ์ฟผ๋ฆฌ์์๋ ๊ฑฐ์ ์ ๊ฒฝ ์ ์จ๋ ๋จ.
3. ORDER BY ์ฒ๋ฆฌ
- ์ธ๋ฑ์ค ์ด์ฉ
- ์ฅ์ : ์ด๋ฏธ ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๋น ๋ฆ
- ex) SELECT * FROM members ORDER BY age;
- age๊ฐ ์ด๋ฏธ ์ธ๋ฑ์ค๋ก ์ง์ ๋์ด์๋ค๋ฉด, ์ตํฐ๋ง์ด์ ๋ ๊ทธ๋ฅ ์ธ๋ฑ์ค ์์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ๋ง ํ๋ฉด๋จ(๋ณ๋์ ์ ๋ ฌ ์ฐ์ฐ ํ์งX)
- ๋จ์ : ์ฐ๊ธฐ ์์
์ ์ธ๋ฑ์ค ์ถ๊ฐ/์ญ์ ์์
์ด ํ์ํด์ ๋๋ฆผ, ์ธ๋ฑ์คโโ๋ฉ๋ชจ๋ฆฌโ
- Filesort์ด์ฉ
- ๊ณผ์ : ์กฐ๊ฑด์ ๋ง๋ ํ
์ด๋ธ ๊ฐ์ ธ์ด โ ๊ฒฐ๊ณผ๋ฅผ ์์ tb/๋ฉ๋ชจ๋ฆฌ(์ํธ๋ฒํผ)์ ๋ด์ โ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋๋ฆผโ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ ๋ฐํ
- ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ - ์ ๋ ฌ๊ธฐ์คโ, group by / distinct ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฑ
- ์ฅ์ : ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ๋์ ๋จ์ ์ด ์์ด์ง.
- ๋จ์ : ์ ๋ ฌ ์์
์ด ์ฟผ๋ฆฌ ์คํ ์ ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ ์ฝ๋ ๊ฑด์๊ฐ ๋ง์์ง์๋ก ์ฟผ๋ฆฌ์ ์๋ต ์๋๊ฐ ๋๋ฆผ,๋์คํฌ I/O ๋ฐ์ ๊ฐ๋ฅ
- ์ํธ๋ฒํผ : ์ ๋ ฌ์ ์ํํ๊ธฐ ์ํ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ, ์คํ์๋ฃ ํ ๋ฐ๋ก ๋ฐ๋ฉ
- ์ ๋ ฌํด์ผํ๋ ๋ ์ฝ๋ ํฌ๊ธฐ์ ๋ฐ๋ผ ๊ฐ๋ณ์ ์ผ๋ก ์ฆ๊ฐ, ์ต๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฒํผ๊ณต๊ฐ ์ง์ ๊ฐ๋ฅ
- ์ ๋ ฌ์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ต๋์น๋ณด๋ค ํฐ๊ฒฝ์ฐ ๋ ์ฝ๋๋ฅผ ์ฌ๋ฌ์กฐ๊ฐ์ผ๋ก ๋๋ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์คํฌ ์ฌ์ฉโ ๋์คํฌ I/O โ โ ๊ทธ๋ ๋ค๊ณ ์ํธ๋ฒํผ๋ฅผ ํฌ๊ฒ ์ค์ ํด๋ ์ฑ๋ฅ์ ๋น์ทํจ
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ฑ๊ธ ํจ์ค(Single-pass) : ๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์ํธ ๋ฒํผ์ ๋ด๋ ์ ๋ ฌ ๋ฐฉ์ โ MySQL ์ต์ ๋ฒ์ ์์ ์ฌ์ฉ
- ์ ๋ ฌ๊ธฐ์ค ์ปฌ๋ผ, Select์ ์ปฌ๋ผ ์ ๋ถ ๋ด์
- ํฌ ํจ์ค(Two-pass) : ์ ๋ ฌ ๊ธฐ์ค ์ปฌ๋ผ๊ณผ PK๋ง ์ํธ ๋ฒํผ์ ๋ด๋ ์ ๋ ฌ ๋ฐฉ์
- ์ํธ ๋ฒํผ์ ๋ด์๊ฑธ ์์๋๋ก ๋ค์ PK๋ก ํ
์ด๋ธ์ ์ฝ์ด selectํ ์ปฌ๋ผ ๊ฐ์ ธ์ด โ ์ฆ, ํ
์ด๋ธ 2๋ฒ ์ฝ์ด์ฌํจ โ MySQL ์ต์ ๋ฒ์ ์์๋ ์ฃผ๋ก ์ฑ๊ธ ํจ์ค ์ฌ์ฉ(ํฌํจ์ค ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์กด์ฌํจ)
- ์ ๋ ฌ ์ฒ๋ฆฌ๋ฐฉ๋ฒ
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ โ ์กฐ์ธ์์ ๋๋ผ์ด๋น ํ
์ด๋ธ๋ง ์ ๋ ฌ โ ์กฐ์ธ์์ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ
์ด๋ธ๋ก ์ ์ฅ ํ ์ ๋ ฌ
- ๋๋ผ์ด๋น ํ
์ด๋ธ : ์กฐ์ธ์ ์คํํ๊ธฐ ์ ์ ์ฒซ๋ฒ์งธ๋ก ์ฝํ๋ ํ
์ด๋ธ
๐ก ์๋น์ค ์ค๊ณ ๊ด์
- โ์ด ์ปฌ๋ผ์ผ๋ก ์ ๋ ฌ ์์ฃผ ํ๋คโ โ ํด๋น ์ปฌ๋ผ์ ์ธ๋ฑ์ค ๊ฑธ๋ฉด โ ์ตํฐ๋ง์ด์ ๊ฐ ์ธ๋ฑ์ค ์ ๋ ฌ ์ฌ์ฉ
- โ์ ๋ ฌ ์ผ์ด์ค๊ฐ ๋ค์ํ๋คโ โ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ธ๋ฑ์ค๋ก ์ปค๋ฒ ๋ถ๊ฐ โ ์ตํฐ๋ง์ด์ ๋ ํ์ผ์ํธ ์ ํ
4. GRUOP BY ์ฒ๋ฆฌ
- ์ธ๋ฑ์ค ์ค์บ์ ์ด์ฉํ๋ GROUP BY
- ์กฐ์ธ์ ๋๋ผ์ด๋น ํ
์ด๋ธ์ ์ธ๋ฑ์ค๊ฐ ์๊ณ , ํด๋น ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ฃจํ์ ํ๋ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ฅผ ์์๋๋ก ์ฝ์ผ๋ฉด์ ๊ทธ๋ฃจํ ์์
์ ์ํ, ๊ทธ ๊ฒฐ๊ณผ๋ก ์กฐ์ธ์ ์ฒ๋ฆฌ
- ๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ์ ์ด์ฉํ๋ GROUP BY
- ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ฐ๋ฉด์ ํ์ํ ๋ถ๋ถ๋ง ์ฝ์ด์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์
- ex) SELECT a, MAX(b) FROM t GROUP BY a
- ์ธ๋ฑ์ค
(a, b)๊ฐ ์์ ๋, ๊ฐ a ๊ทธ๋ฃน์์ b์ ์ต์/์ต๋๊ฐ ๋๋ ๊ฒฝ๊ณ๊ฐ๋ง ์ฐ๊ณ ๊ฑด๋๋
- ์์ ํ
์ด๋ธ์ ์ฌ์ฉํ๋ GROUP BY
- ์ธ๋ฑ์ค๋ฅผ ์ ํ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ์์ ํ
์ด๋ธ ์ฌ์ฉ
๐ก ์๋น์ค ์ค๊ณ ๊ด์
- ์์ฃผ ์ฐ๋ GROUP BY ํจํด์ด ๊ณ ์ ์ ? โ ์ธ๋ฑ์ค ์ค์บ์ ์ด์ฉํ๋ GROUP BY
- ๊ทธ๋ฃน๋ณ ๋ํ๊ฐ(์ต์ /์ต์/์ต๋/Distinct)์ด ํต์ฌ? โ ๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ์ ์ด์ฉํ๋ GROUP BY
์ตํฐ๋ง์ด์ ์ ์คํ ๊ณํ ํ์ธ ๋ฐฉ๋ฒ

- type: ALL โ ํ์ค์บ / type: ref โ ์ธ๋ฑ์ค ์ค์บ
- Extra๊ฐ Using filesort โ ํ์ผ์ํ
์ฌ์ฉ / Using index โ ์ธ๋ฑ์ค ์ฌ์ฉ
์ตํฐ๋ง์ด์ ๋ RDBMS, NoSQL ๋ค ์ฌ์ฉ ๊ฐ๋ฅํ๊ฑด๊ฐ?
๐ก ๋๋ค ์ฌ์ฉ๊ฐ๋ฅํ์ง๋ง, RDBMS๊ฐ ๋ ๋ง์ด ๋ฐ์ ๋จ.
NoSQL์ ๋ณต์กํ ์ฟผ๋ฆฌ ์ธ์ด๊ฐ ์๊ฑฐ๋ ๋จ์ โ ์ธ๋ฑ์ค ์ ํ, ์ค๋ฉ ํค ์ ํ ์ ๋์ ๊ฐ๋จํ ์ตํฐ๋ง์ด์ ๋ ์กด์ฌํจ
์์ ์ค๋ช
ํ ๊ฒ๋ค์ RDBMS ๊ธฐ์ค!
๐ ๋ง๋ฌด๋ฆฌ
์ตํฐ๋ง์ด์ ๋, ์ฌ์ฉ์๊ฐ ๋ณด๋ด๋ SQL์ ์ด๋ป๊ฒ ํ๋ฉด ๋น์ฉ์ด ์ ๊ณ , ๋น ๋ฅด๊ฒ ์คํํ ์ ์๋์ง๋ฅผ ๊ณํํ๋ ์์ง์ผ๋ก, ์ตํฐ๋ง์ด์ ์ ๋์ ์๋ฆฌ๋ฅผ ์์์ผ โ๋ด ์ฟผ๋ฆฌ๊ฐ ์ ๋๋ฆฐ์งโ ์์ธ์ ์ฐพ๊ณ , ์ด๋ป๊ฒ ๊ณ ์น ์ง(์ฟผ๋ฆฌ ์์ /์ธ๋ฑ์ค ์ถ๊ฐ/์บ์ฑ) ํ๋จํ ์ ์๋ค!
๐ ํ๊ณ
์ด๋ฒ ์ ๋ฆฌ๋ฅผ ํตํด โSQL์ด ์คํ๋๊ธฐ๊น์ง DB ๋ด๋ถ์์ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์งโ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ์ดํดํ๊ฒ ๋์๋ค.
ํนํ ๊ฐ์ SQL์ด๋ผ๋ ์คํ๊ณํ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ๋ ์ ์๊ณ ,
์ตํฐ๋ง์ด์ ๊ฐ ํต๊ณ ์ ๋ณด์ ๋น์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์คํ ๋ฐฉ๋ฒ์ ์ ํํ๋ค๋ ์ ์ด ์ธ์ ๊น์๋ค.
์ด์ ์๋ EXPLAIN ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋๋ผ๋
type, Extra, Using filesort ๊ฐ์ ํญ๋ชฉ๋ค์ด ๋จ์ํ ์ฉ์ด์ฒ๋ผ ๋๊ปด์ก๋ค๋ฉด,
์ด์ ๋ ์ ์ด๋ฐ ์คํ๊ณํ์ด ๋์๋์ง,
๊ทธ๋ฆฌ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ๋ฉด ์ตํฐ๋ง์ด์ ์ ์ ํ์ด ๋ฌ๋ผ์ง์ง๋ฅผ ๊ณ ๋ฏผํ ์ ์๊ฒ ๋์๋ค.
๋ํ ๋จ์ํ โ์ธ๋ฑ์ค๋ฅผ ์ฐ๋ฉด ๋น ๋ฅด๋คโ๊ฐ ์๋๋ผ,
- ์ธ์ ํ ํ
์ด๋ธ ์ค์บ์ด ๋ ๋์ ์ ์๋์ง
- ORDER BY / GROUP BY์์ ์ธ๋ฑ์ค๊ฐ ์ด๋ป๊ฒ ํ์ฉ๋๋์ง
- ํ์ผ์ํธ์ ์์ ํ
์ด๋ธ์ด ์ ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋๋์ง
๊ฐ์ DB์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ์์ ์์ธํ ์ดํดํด๋ณผ ์ ์์๋ ์๋ฏธ์๋ ์๊ฐ์ด์๋ ๊ฒ ๊ฐ๋ค.
[์ฐธ๊ณ ์๋ฃ]
https://dev.mysql.com/doc/refman/8.4/en/optimization.html
Real MySQL 8.0
https://velog.io/@kwontae1313/์ตํฐ๋ง์ด์
https://velog.io/@cham-chi/DB-๋ฐ์ดํฐ๋ฒ ์ด์ค-์ฟผ๋ฆฌ-์ตํฐ๋ง์ด์ Query-Optimizer์-๋ํ์ฌ