DBMS์ ์ตํฐ๋ง์ด์ ๋ ์ฟผ๋ฆฌ๋ฅผ ์ต์ ์ผ๋ก ์คํํ๊ธฐ ์ํด ๊ฐ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๋ถํฌ๋ก ์ ์ฅ๋์ด ์๋์ง ๋ฑ์ ์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ต์ ์ ์คํ ๊ณํ์ ์๋ฆฝํ๋ค.
MySQL์์๋ EXPLAIN ์ด๋ผ๋ ๋ช
๋ น์ผ๋ก ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ํ์ธํ ์ ์๋ค.
1. ๊ฐ์
์ฟผ๋ฆฌ ์คํ ์ ์ฐจ
MySQL ์๋ฒ์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๊ณผ์ ์ ํฌ๊ฒ ์ธ ๋จ๊ณ๋ก ๋๋ ์ ์๋ค.
- ์ฌ์ฉ์๋ก๋ถํฐ ์์ฒญ๋ SQL ๋ฌธ์ฅ์ ์๊ฒ ์ชผ๊ฐ์ ๋ถ๋ฆฌํ๋ค (Parse Tree)
- SQL ๋ฌธ์ฅ์ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๊ฒ์ฌ
- SQL์ Parse Tree๋ฅผ ํ์ธํ๋ฉด์ ์ด๋ค ํ
์ด๋ธ๋ถํฐ ์ฝ๊ณ ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ํ
์ด๋ธ์ ์ฝ์์ง ์ ํํ๋ค.
- ๋ถํ์ํ ์กฐ๊ฑด ์ ๊ฑฐ ๋ฑ ๋ณต์กํ ์ฐ์ฐ์ ๋จ์ํ
- ์ฌ๋ฌ ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๊ฒฝ์ฐ ์ด๋ค ์์๋ก ํ ์ด๋ธ์ ์ฝ์์ง ๊ฒฐ์
- ๊ฐ ํ ์ด๋ธ์ ์ฌ์ฉ๋ ์กฐ๊ฑด๊ณผ ์ธ๋ฑ์ค ํต๊ณ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉํ ์ธ๋ฑ์ค ๊ฒฐ์
- ๋ ๋ฒ์งธ ๋จ๊ณ์์ ๊ฒฐ์ ๋ ํ ์ด๋ธ์ ์ฝ๊ธฐ ์์๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ตํฐ๋ง์ด์ ์ ์ข ๋ฅ
ํฌ๊ฒ ๊ท์น ๊ธฐ๋ฐ ์ต์ ํ์ ๋น์ฉ ๊ธฐ๋ฐ ์ต์ ํ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
Rule-based optimizer๋ ํ ์ด๋ธ์ ๋ ์ฝ๋ ๊ฑด์๋ ์ ํ๋ ๋ฑ์ ๊ณ ๋ คํ์ง ์๊ณ ์ตํฐ๋ง์ด์ ์ ๋ด์ฅ๋ ์ฐ์ ์์์ ๋ฐ๋ผ ์คํ ๊ณํ์ ์๋ฆฝํ๋ ๋ฐฉ์์ด๋ค.
Cost-based optimizer๋ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ๋ง๋ค๊ณ ๊ฐ ๋จ์ ์์ ์ ๋น์ฉ ์ ๋ณด์ ๋์ ํ ์ด๋ธ์ ์์ธก๋ ํต๊ณ ์ ๋ณด๋ฅผ ์ด์ฉํด ์คํ ๊ณํ๋ณ ๋น์ฉ์ ์ฐ์ถํ๋ค.
ํ์ฌ ๋๋ถ๋ถ์ DBMS๋ค์ Cost-based optimizer๋ฅผ ์ฌ์ฉ์ค์ด๋ค.
๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
ํ ํ ์ด๋ธ ์ค์บ๊ณผ ํ ์ธ๋ฑ์ค ์ค์บ
ํ ํ ์ด๋ธ ์ค์บ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํ ์ด๋ธ์ ์ฒ์๋ถํฐ ๋๊น์ง ์ฝ์ด์ ์์ฒญ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๋ค. MySQL ์ตํฐ๋ง์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ผ ๋ ์ฃผ๋ก ํ ํ ์ด๋ธ ์ค์บ์ ์ ํํ๋ค.
- ํ ์ด๋ธ์ ๋ ์ฝ๋ ๊ฑด์๊ฐ ๋๋ฌด ์์์ ์ธ๋ฑ์ค๋ฅผ ํตํด ์ฝ๋ ๊ฒ๋ณด๋ค ํ ์ด๋ธ์ ์ง์ ์ฝ๋ ๊ฒ์ด ๋น ๋ฅผ ๋
WHERE์ ์ด๋ON์ ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ์๋ ์ ์ ํ ์กฐ๊ฑด์ด ์๋ ๊ฒฝ์ฐ- ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ฌ์ฉํ ์ ์์ด๋ ์กฐ๊ฑด ์ผ์น ๋ ์ฝ๋ ๊ฑด์๊ฐ ๋๋ฌด ๋ง์ ๊ฒฝ์ฐ (์ธ๋ฑ์ค ์ํ๋ง ์กฐ์ฌ ๊ฒฐ๊ณผ)
ํ ํ ์ด๋ธ ์ค์บ์ ํ์ด์ง ํ๋์ฉ ์ฝ์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ํ๋ฒ์ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ์ฝ์ด ๋ฒํผ ํ์ ์ ์ฅํด์ค๋ค. ์ด๋ฅผ Read Ahead ๋ผ๊ณ ํ๋ค.
ํ ์ธ๋ฑ์ค ์ค์บ๋์์๋ ๋์ผํ๊ฒ ์๋ํ๋ค.
SELECT COUNT(*) FROM employees;
ํด๋น ์ฟผ๋ฆฌ๋ ์ฉ๋์ด ๋ ์์ ์ธ๋ฑ์ค๋ฅผ ํ ์ค์บํ๋ค.
๋ณ๋ ฌ ์ฒ๋ฆฌ
MySQL 8.0 ์ดํ๋ถํฐ innodb_parallel_read_threads ์์คํ
๋ณ์๋ก ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ต๋ ๋ช ๊ฐ์ ์ค๋ ๋๋ฅผ ์ด์ฉํด์ ์ฒ๋ฆฌํ ์ง ์ค์ ํ ์ ์๋ค. ๋ฌผ๋ก ์ค๋ ๋ ๊ฐ์๋ฅผ ๋ฌดํ์ ๋๋ ค ๋ดค์ ์ฝ์ด ๊ฐ์๊ฐ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋ฌดํ์ ๋์ด๋์ง๋ ์๋๋ค.
ORDER BY ์ฒ๋ฆฌ
์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ, Filesort๋ฅผ ์ด์ฉํ ์ ๋ ฌ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์กด์ฌํ๋ค.
- ์ธ๋ฑ์ค
- ์ฅ์ : ์ธ๋ฑ์ค๋ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์์ด์ ์กฐํ๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค. ์์๋๋ก ์ฝ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
- ๋จ์ : INSERT, UPDATE, DELETE ์์ ์ ๋ถ๊ฐ์ ์ธ ์ธ๋ฑ์ค ์ถ๊ฐ, ์ญ์ ์์ ์ด ํ์ํด์ ๋๋ฆฌ๋ค. ์ธ๋ฑ์ค ๋๋ฌธ์ ๋์คํฌ ๊ณต๊ฐ์ด ๋ ๋ง์ด ํ์ํ๋ค.
- Filesort
- ์ฅ์ : ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ฏ๋ก INSERT, UPDATE, DELETE๊ฐ ๋ ๋น ๋ฅด๋ค.
- ๋จ์ : ์ ๋ ฌ ์์ ์ด ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ ์ฝ๋ ๋์ ๊ฑด์๊ฐ ๋ง์์ง์๋ก ์๋ต ์๋๊ฐ ๋๋ ค์ง๋ค.
MySQL ์๋ฒ์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ณ๋์ ์ ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋์ง ์ฌ๋ถ๋ฅผ ์ ์ ์๋ค. ์คํ ๊ณํ์ Extra ์ปฌ๋ผ์ โUsing Filesortโ ๋ฉ์์ง๊ฐ ํ์๋๋ค.
์ํธ ๋ฒํผ
์ ๋ ฌ์ ์ํ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ Sort Buffer๋ผ๊ณ ํ๋ค. ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ํ ๋น๋๋ค.
์ ๋ ฌํด์ผ ํ ๋ ์ฝ๋์ ๊ฑด์๊ฐ ๋งค์ฐ ๋ง์์ ์ํธ ๋ฒํผ๋ก๋ง ํด๊ฒฐํ ์ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ ๋ ฌํด์ผ ํ๋ ๋ ์ฝ๋๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ์ ์ ๋ ฌํ๋ค. ์ด ๋ ์์ ์ ์ฅ ๊ณต๊ฐ์ผ๋ก ๋์คํฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ดํ ๊ฐ ๋ฒํผ ํฌ๊ธฐ๋งํผ ์ ๋ ฌ๋ ๋ ์ฝ๋๋ฅผ ๋ค์ ๋ณํฉํ๋ฉด์ ์ ๋ ฌํ๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋์คํฌ ์ฝ๊ธฐ, ์ฐ๊ธฐ๋ฅผ ์ ๋ฐํ๋ค.
Sort Buffer ํฌ๊ธฐ๋ฅผ ๋๋ฌด ํฌ๊ฒ ๋ง๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ณผ์ ์์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๊ณ , OOM์ด ๋ฐ์ํ์ฌ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ์๋ ์๋ค.
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
๋ ์ฝ๋๋ฅผ ์ ๋ ฌํ ๋ ๋ ์ฝ๋ ์ ์ฒด๋ฅผ ์ํธ ๋ฒํผ์ ๋ด์์ ์ ๋ ฌํ ์ง, ์ ๋ ฌ ๊ธฐ์ค์ด ๋๋ ์ปฌ๋ผ๋ง ์ํธ ๋ฒํผ์ ๋ด์์ง์ ๋ฐ๋ผ ์ฑ๊ธ ํจ์ค์ ํฌ ํจ์ค 2๊ฐ์ง ์ ๋ ฌ ๋ชจ๋๋ก ๋๋ ์ ์๋ค.
ํฌ ํจ์ค ๋ฐฉ์์ ํ ์ด๋ธ์ ๋ ๋ฒ ์ฝ์ด์ผ ํ๋ค. ์ฑ๊ธ ํจ์ค ์ ๋ ฌ ๋ฐฉ์์ ๋ ๋ง์ ์ํธ ๋ฒํผ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ค. ์ต์ ๋ฒ์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฑ๊ธ ํจ์ค ์ ๋ ฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
๋ง์ฝ ๋ ์ฝ๋์ ํฌ๊ธฐ๊ฐ max_length_for_sort_data ๋ณ์์ ์ค์ ๋ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋, BLOB, TEXT ํ์
์ ์ปฌ๋ผ์ด ๋์์ด ๋๋ ๊ฒฝ์ฐ ํฌ ํจ์ค ์ ๋ ฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์ ๋ ฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
๋ค์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ก ์ ๋ ฌ์ด ์ฒ๋ฆฌ๋๋ค. ์๋๋ก ๊ฐ์๋ก ์ฒ๋ฆฌ ์๋๊ฐ ๋จ์ด์ง๋ค.
- ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ
- ์กฐ์ธ์์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ => Using filesort
- ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ด๋ธ์ ์ ์ฅ ํ ์ ๋ ฌ => Using temporary; Using filesort
๋จผ์ ์ตํฐ๋ง์ด์ ๋ ์ ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ธ๋ฑ์ค๋ฅด ์ด์ฉํ ์ ์๋์ง ๊ฒํ ํ๋ค. ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด WHERE ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ์ํธ ๋ฒํผ์ ์ ์ฅํ๋ฉด์ ์ ๋ ฌํ๋ค.
MySQL ์ตํฐ๋ง์ด์ ๋ ์ ๋ ฌ ๋์ ๋ ์ฝ๋๋ฅผ ์ต์ํํ๊ธฐ ์ํด 2๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ ํํ๋ค
- ์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌํ ๋ค์ ์กฐ์ธ ์ํ
- ์กฐ์ธ์ด ๋๋๊ณ ์ผ์นํ๋ ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์จ ํ ์ ๋ ฌ์ ์ํ
์กฐ์ธ์ด ์ํ๋๋ฉด์ ๋ ์ฝ๋ ํฌ๊ธฐ๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ์ ์๊ฐ ๋ ํจ์จ์ ์ด๋ค.
์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ
๋ฐ๋์ ORDER BY์ ๋ช
์๋ ์นผ๋ผ์ด ์ ์ผ ๋จผ์ ์ฝ๋ ํ
์ด๋ธ(์กฐ์ธ์ด ์ฌ์ฉ๋ ๊ฒฝ์ฐ ๋๋ผ์ด๋น ํ
์ด๋ธ) ์ ์ํ๊ณ ORDER BY์ ์์๋๋ก ์์ฑ๋ ์ธ๋ฑ์ค๊ฐ ์์ด์ผ ํ๋ค. WHERE ์ ์ ์ ์ผ ๋จผ์ ์ฝ๋ ํ
์ด๋ธ์ ์ปฌ๋ผ์ ๋ํ ์กฐ๊ฑด์ด ์๋ค๋ฉด ๊ทธ ์กฐ๊ฑด๊ณผ ORDER BY๋ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
๋น์ฐํ์ง๋ง ํด์ ์ธ๋ฑ์ค๋ ์ ๋ฌธ ๊ฒ์ ์ธ๋ฑ์ค์์๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ์ ์ํํ ์ ์๋ค.
์กฐ์ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ง ์ ๋ ฌ
๋๋ผ์ด๋น ํ ์ด๋ธ์ ์กฐ์ธ ์ฟผ๋ฆฌ์์ ๊ฐ์ฅ ๋จผ์ ์ค์บ๋๋ ํ ์ด๋ธ๋ก, ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ์ ์กฐ์ธ ๊ณผ์ ์์ ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ ๋ฐ์ดํฐ์ ์์ด ์ ์ ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ ํํ์ฌ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๊ฐ๋ ฅํ ํํฐ๋ง ์กฐ๊ฑด(์ฆ, ๊ฒฐ๊ณผ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ ์กฐ๊ฑด)์ ๊ฐ์ง ํ ์ด๋ธ์ด ์ ๋ฆฌํฉ๋๋ค. ์ธ๋ฑ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํ ์ด๋ธ์ ๋๋ผ์ด๋น ํ ์ด๋ธ๋ก ์ค์ ํ์ฌ ์ ๊ทผ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํฉ๋๋ค.
์กฐ์ธ์ด ์ํ๋๋ฉด ๋ ์ฝ๋ ๊ฑด์๋ ๋์ด๋๊ณ ๋ ์ฝ๋ ํ๋ํ๋์ ํฌ๊ธฐ๋ ๋์ด๋๋ค. ๊ทธ๋์ ๋๋ผ์ด๋น ํ
์ด๋ธ์ ๋จผ์ ์ ๋ ฌํ ๋ค์ ์กฐ์ธ์ ์คํํ๋ฉด ํจ์จ์ ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฌ์ด ์ํ๋๋ ค๋ฉด ๋๋ผ์ด๋น ํ
์ด๋ธ์ ์ปฌ๋ผ๋ง์ผ๋ก ORDER BY ์ ์ ์์ฑํด์ผ ํ๋ค.
SELECT *
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
AND e.emp_no BETWEEN 102 AND 110
ORDER BY e.last_name;
WHERE ์ ์ ์กฐ๊ฑด์ employees ํ
์ด๋ธ์ PK๋ฅผ ์ฌ์ฉํ๋ค. ๋ salaries์ ์กฐ์ธ ์ปฌ๋ผ์ธ emp_no์ ์ธ๋ฑ์ค๊ฐ ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ์ตํฐ๋ง์ด์ ๋ employees ํ
์ด๋ธ์ ๋๋ผ์ด๋น ํ
์ด๋ธ๋ก ์ ํํ๋ค.
์์ ํ ์ด๋ธ์ ์ด์ฉํ ์ ๋ ฌ
SELECT *
FROM employees e, salaries s
WHERE s.emp_no = e.emp_no
AND e.emp_no BETWEEN 102 AND 110
ORDER BY s.salary;
์ด ์ฟผ๋ฆฌ๋ ์ ๋ ฌ ๊ธฐ์ค์ด ๋๋ผ์ด๋น ํ ์ด๋ธ์ด ์๋ ๋๋ฆฌ๋ธ ํ ์ด๋ธ์ ์กด์ฌํ ์ปฌ๋ผ์ด๋ค. ์ด ๊ฒฝ์ฐ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ ์ด๋ธ์ ์ ์ฅํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ๋ ฌํด์ผ ํ๋ค. ๊ฐ์ฅ ๋๋ฆฐ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด๋ค.
์ ๋ ฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ฑ๋ฅ ๋น๊ต
์ผ๋ฐ์ ์ผ๋ก LIMIT ์ ์ฌ์ฉํ๋ฉด ์ฒ๋ฆฌํ๋ ์์ ์ค์ผ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ ORDER BY ํน์ GROUP BY ๊ฐ์ ์์
์ WHERE ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฐ๊ณผ๋ฅผ LIMIT๋งํผ๋ง ๊ฐ์ ธ์์ ์ฒ๋ฆฌํ ์ ์๊ณ ๋ชจ๋ ๊ฐ์ ธ์จ ํ ์ ๋ ฌ์ ์ํํ๊ฑฐ๋ ๊ทธ๋ฃจํ์ ํ ํ LIMIT์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
- ์คํธ๋ฆฌ๋ฐ ๋ฐฉ์: ์๋ฒ ์ชฝ์์ ๋ ์ฝ๋๊ฐ ๊ฒ์๋ ๋๋ง๋ค ๋ฐ๋ก๋ฐ๋ก ํด๋ผ์ด์ธํธ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ์กํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
LIMIT์ ์ฌ์ฉํ๋ฉด ์ฒ๋ฆฌ๋์ ์ค์ผ ์ ์๋ค. - ๋ฒํผ๋ง ๋ฐฉ์: ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์์ ์ ๋ ฌํ ํ ์ฐจ๋ก๋๋ก ๋ณด๋ด์ผ ํ๋ค.
LIMIT์ ์ฌ์ฉํด๋ ์ฒ๋ฆฌ๋์ด ๊ฐ์ ๋์ง ์๋๋ค.
ORDER BY ์ฒ๋ฆฌ ๋ฐฉ์์์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์ ๋ ฌ ๋ฐฉ์๋ง ์คํธ๋ฆฌ๋ฐ ํํ์ ์ฒ๋ฆฌ์ด๊ณ ๋๋จธ์ง๋ ๋ชจ๋ ๋ฒํผ๋ง ๋ฐฉ์์ด๋ค.
GROUP BY ์ฒ๋ฆฌ
GROUP BY๋ ์ฟผ๋ฆฌ๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ ์ ์๊ฒ ๋ง๋ ๋ค. ๋๊ฐ์ด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ์ ์ด์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ก ๋๋ ์ ์๋ค.
์ธ๋ฑ์ค ์ค์บ
ORDER BY์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ผ์ด๋น ํ
์ด๋ธ์ ์ํ ์ปฌ๋ผ๋ง ์ด์ฉํด ๊ทธ๋ฃจํํ ๋ ์ธ๋ฑ์ค ์ค์บ์ ํ๊ฒ ๋๋ค. ์ด๋ฏธ ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฐจ๋ก๋๋ก ์ฝ์ผ๋ฉด์ ๊ทธ๋ฃจํ์ ํ๋ค.
๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ
๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ์ ์ธ๋ฑ์ค์ ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ฐ๋ฉด์ ํ์ํ ๋ถ๋ถ๋ง ์ฝ์ด์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ค. ๋ฃจ์ค ์ธ๋ฑ์ค ์ค์บ์ ์ฌ์ฉํ ๋๋ ์คํ ๊ณํ์ Extra ์ปฌ๋ผ์ โUsing index for group-byโ ๋ผ๋ ์ฝ๋ฉํธ๊ฐ ํ์๋๋ค.
EXPLAIN
SELECT emp_no
FROM salaries
WHERE from_date='1985-03-01'
GROUP BY emp_no;
(emp_no, from_date)๋ก ์ธ๋ฑ์ค๊ฐ ์์ฑ๋์ด ์๋ค๊ณ ํ์. ์ด ๊ฒฝ์ฐ WHERE ์ ์ ์๋ ์กฐ๊ฑด์ ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ฌ์ฉํ ์ ์๋ค.
ํ์ง๋ง ์ด ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ์ธ๋ฑ์ค ๋ ์ธ์ง ์ค์บ์ ์ฌ์ฉํ์ผ๋ฉฐ, GROUP BY ์ฒ๋ฆฌ๊น์ง ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ค.
- (emp_no, from_date) ์ธ๋ฑ์ค๋ฅผ ์ฐจ๋ก๋๋ก ์ค์บํ๋ฉด์ emp_no์ ์ฒซ ๋ฒ์งธ ์ ์ผํ ๊ฐ(10001)์ ์ฐพ์ ๋ธ๋ค.
- (emp_no, from_date) ์ธ๋ฑ์ค์์ emp_no=10001์ธ ๊ฒ ์ค์์ from_date=โ1985-03-01โ์ธ ๋ ์ฝ๋๋ง ๊ฐ์ ธ์จ๋ค. AND ์กฐ๊ฑด์ผ๋ก (emp_no, from_date) ์ธ๋ฑ์ค๋ฅผ ๊ฒ์ํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
- (emp_no, from_date) ์ธ๋ฑ์ค์์ ๊ทธ ๋ค์ emp_no๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ๋ฐ๋ณตํ๋ค
์์ ํ ์ด๋ธ ์ด์ฉ
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ์์ ํ
์ด๋ธ์ ๋ง๋ ๋ค. ์ด ๋ GROUP BY ์ ์ ์ปฌ๋ผ๋ค๋ก ๊ตฌ์ฑ๋ ์ ๋ํฌ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ํ
์ด๋ธ์ ๋ง๋ค์ด์ ์ค๋ณต ์ ๊ฑฐ์ ์งํฉ ํจ์ ์ฐ์ฐ์ ์ํํ๋ค.
EXPLAIN
SELECT e.last_name, AVG(s.salary)
FROM employees e, salaries s
WHERE s.emp_no=e.emp_no
GROUP BY e.last_name;
์ด ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์์ ํ ์ด๋ธ์ ์์ฑํ๋ค.
CREATE TEMPORARY TABLE ... (
last_name VARCHAR(16),
salary INT,
UNIQUE INDEX ux_lastname (last_name)
);
๊ทธ๋ฆฌ๊ณ ์กฐ์ธ ๊ฒฐ๊ณผ๋ฅผ ํ ๊ฑด์ฉ ๊ฐ์ ธ์ ์์ ํ
์ด๋ธ์์ ์ค๋ณต ์ฒดํฌ๋ฅผ ํ๋ฉด์ INSERT ํน์ UPDATE๋ฅผ ์คํํ๋ค. ๋ณ๋์ ์ ๋ ฌ ์์
์์ด GROUP BY๊ฐ ์ฒ๋ฆฌ๋๋ค.
DISTINCT ์ฒ๋ฆฌ
ํน์ ์ปฌ๋ผ์ ์ ๋ํฌํ ๊ฐ๋ง ์กฐํํ๋ ค๋ฉด DISTINCT๋ฅผ ์ฌ์ฉํ๋ค. ํฌ๊ฒ MIN(), MAX(), COUNT() ๊ฐ์ ์งํฉ ํจ์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ, ์งํฉ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
SELECT DISTINCT
๋จ์ํ SELECT ๋๋ ๋ ์ฝ๋ ์ค์์ ์ ๋ํฌํ ๋ ์ฝ๋๋ง ๊ฐ์ ธ์ค๊ณ ์ ํ๋ ๊ฒฝ์ฐ GROUP BY์ ๋๊ฐ์ด ์ฒ๋ฆฌ๋๋ค.
SELECT DISTINCT emp_no FROM salaries;
SELECT emp_no FROM salaries GROUP BY emp_no;
๋ ์ฟผ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ ์์ ์ ์ํํ๋ค.
์งํฉ ํจ์์ ํจ๊ป ์ฌ์ฉ๋ DISTINCT
์งํฉ ํจ์๊ฐ ์๋ ์ฟผ๋ฆฌ์์๋ ์กฐํํ๋ ๋ชจ๋ ์นผ๋ผ์ ์กฐํฉ์ด ์ ๋ํฌํ ๊ฒ๋ค๋ง ๊ฐ์ ธ์จ๋ค. ํ์ง๋ง ์งํฉ ํจ์ ๋ด์์ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ ๊ทธ ์ธ์๋ก ์ ๋ฌ๋ ์นผ๋ฝ๊ฐ์ด ์ ๋ํฌํ ๊ฒ๋ค์ ๊ฐ์ ธ์จ๋ค.
์งํฉ ํจ์์ ํจ๊ป ์ฌ์ฉํ ๋๋ ํญ์ ์์ ํ ์ด๋ธ์ ์์ฑํ๊ฒ ๋๋ค. ํ์ง๋ง ์คํ ๊ณํ์๋ ๋ฐ๋ก ํ์๋์ง ์๋๋ค.
EXPLAIN
SELECT COUNT(DISTINCT s.salary)
from employees e, salaries s
WHERE e.emp_no=s.emp_no
and e.emp_no BETWEEN 101 AND 110;
์ด ์ฟผ๋ฆฌ๋ ์กฐ์ธ ๊ฒฐ๊ณผ์์ salary ์นผ๋ผ์ ๊ฐ๋ง ์ ์ฅํ๊ธฐ ์ํ ์์ ํ
์ด๋ธ์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค. ๋ง์ฝ COUNT(DISTINCT )๊ฐ ๋ ์ถ๊ฐ๋๋ค๋ฉด ์์ ํ
์ด๋ธ๋ ์ถ๊ฐ๋๋ค.
ํ์ง๋ง ์ธ๋ฑ์ค๋ ์ปฌ๋ผ์ ๋ํด COUNT(DISTINCT )๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๋ ์ธ๋ฑ์ค๋ฅผ ํ๋ฉด์ ์์ ํ
์ด๋ธ ์์ด ์ต์ ํ๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
๋ด๋ถ ์์ ํ ์ด๋ธ ํ์ฉ
- MySQL ์์ง์ด ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก๋ถํฐ ๋ฐ์์จ ๋ ์ฝ๋๋ฅผ ์ ๋ ฌํ๊ฑฐ๋ ๊ทธ๋ฃจํํ ๋๋ **๋ด๋ถ์ ์ธ ์์ ํ ์ด๋ธ(Internal temporary table)**์ ์ฌ์ฉํ๋ค.
- ๋ด๋ถ์ (internal)์ด๋ผ ํํํ๋ ์ด์ ๋
CREATE TEMPORARY TABLE๋ช ๋ น์ด๋ก ๋ง๋ ์์ ํ ์ด๋ธ๊ณผ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. - ๋ด๋ถ์ ์ธ ์์ ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๋ค๊ฐ ํ ์ด๋ธ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ๋์คํฌ๋ก ์ฎ๊ฒจ์ง๋ค. ๋ํ ๋ค๋ฅธ ์ธ์ ์ด๋ ์ฟผ๋ฆฌ์์๋ ๋ณผ ์ ์๊ณ ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ์๋์ผ๋ก ์ญ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ ํ ์ด๋ธ๊ณผ ๋์คํฌ ์์ ํ ์ด๋ธ
MySQL 8.0๋ถํฐ TempTable์ด๋ผ๋ ์คํ ๋ฆฌ์ง ์์ง์ด ๋์
๋์๋ค. temptable_max_ram ๊ธฐ๋ณธ๊ฐ 1G๊น์ง ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ๋ ์ปค์ง๋ฉด ๋์คํฌ์ ๊ธฐ๋กํ๊ฒ ๋๋ค. ์ด ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ ์ฅํ ์ ์๋ค.
- MMAP ํ์ผ
- InnoDB ํ ์ด๋ธ
MMAP๋ ๋์คํฌ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งคํํ์ฌ ๋ง์น ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ์ ๊ทผํ ์ ์๋ค. ๋์ InnoDB ํ ์ด๋ธ์์ ์ฌ์ฉํ ์ ์๋ ํฌ๋์ ๋ณต๊ตฌ ๋ฑ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์์ ํ ์ด๋ธ์ด ํ์ํ ์ฟผ๋ฆฌ
ORDER BY์GROUP BY์ ๋ช ์๋ ์นผ๋ผ์ด ๋ค๋ฅธ ์ฟผ๋ฆฌORDER BY์GROUP BY์ ๋ช ์๋ ์นผ๋ผ์ด ์กฐ์ธ์ ์์์ ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ด ์๋ ์ฟผ๋ฆฌ- distinct์
ORDER BY๊ฐ ๋์์ ์ฟผ๋ฆฌ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋๋DISTINCT๊ฐ ์ธ๋ฑ์ค๋ก ์ฒ๋ฆฌ๋์ง ๋ชปํ๋ ์ฟผ๋ฆฌ UNION์ด๋UNION DISTINCT๊ฐ ์ฌ์ฉ๋ ์ฟผ๋ฆฌ(select_type ์นผ๋ผ์ดUNION RESULT์ธ ๊ฒฝ์ฐ)- ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์์ select_type์ด
DERIVED์ธ ์ฟผ๋ฆฌ
์ด ๋ฐ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ ๋๋ ๋ด๋ถ ์์ ํ ์ด๋ธ์ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์์ ํ ์ด๋ธ์ด ๋์คํฌ์ ์์ฑ๋๋ ๊ฒฝ์ฐ
๋ด๋ถ ์์ ํ ์ด๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด ์ง์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์์ ํ ์ด๋ธ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ๋์คํฌ ๊ธฐ๋ฐ ์์ ํ ์ด๋ธ์ ์ฌ์ฉํ๊ฒ ๋๋ค.
UNION์ด๋UNION ALL์์SELECT๋๋ ์นผ๋ผ ์ค์์ ๊ธธ์ด๊ฐ 512๋ฐ์ดํธ ์ด์์ธ ํฌ๊ธฐ์ ์นผ๋ผ์ด ์๋ ๊ฒฝ์ฐGROUP BY๋DISTINCT์นผ๋ผ์์ 512๋ฐ์ดํธ ์ด์์ธ ํฌ๊ธฐ์ ์นผ๋ผ์ด ์๋ ๊ฒฝ์ฐ- ๋ฉ๋ชจ๋ฆฌ ์์ ํ
์ด๋ธ์ ํฌ๊ธฐ๊ฐ
temp_table_max_ram์์คํ ๋ณ์ ๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ