๐ ์ฐ๋ น๋๋ณ ์ธ๊ธฐ ํค์๋, 31s์์ 146ms๊น์ง! ์ฑ๋ฅ ๊ฐ์ ์ฌ์
๐ญ ๋ฌธ์ ์ธ์
์๋น์ค ๋ด์์ ์ ๊ณตํ๋ "์ฐ๋ น๋๋ณ ์ธ๊ธฐ ํค์๋" ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ํต๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ถ์ฒ ๊ธฐ๋ฅ๊ณผ ์ฐ๋๋๋ ํต์ฌ ๊ธฐ๋ฅ์ด์๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋๋ง๋ค ์๋ต ์๋๊ฐ ์ง๋์น๊ฒ ๋๋ฆฌ๋ค๋ ํผ๋๋ฐฑ์ด ๋ค์ด์ค๊ธฐ ์์ํ๋ค.
๐ข ์ฑ๋ฅ ํ ์คํธ ๊ฒฐ๊ณผ
- ๋ก์ปฌ ์กฐํ ์๊ฐ : 31.49์ด
- ๋ฐฐํฌ ์๋ฒ : 504 Gateway Timeout ๋ฐ์
- JMeter ๋ถํ ํ ์คํธ : ์๋ฌ์จ 90% ์ด์
๐ ํต๊ณ ํ์ด์ง์กฐ์ฐจ ์ด๋ฆฌ์ง ์๋ ์ํฉ..์ด์ ํ๊ฒฝ์์๋ ์ฌ์ค์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ ์ํ์๋ค.
๐ ํ์ฌ ๊ตฌ์กฐ ๋ถ์
๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ธฐ์กด ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด
์๋ธ ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ๋ค๋จ๊ณ ์ง๊ณ ๋ฐฉ์์ผ๋ก ์์ฑ๋์ด ์์๋ค.
ํด๋น ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ๋์ํ๋ค.
1๏ธโฃ ๋ด๋ถ ์๋ธ ์ฟผ๋ฆฌ
๐ userKeyword์ user ํ
์ด๋ธ ์กฐ์ธ
๐ user.Age๊ฐ minAge ~ maxAge ์ฌ์ด์ธ ์ฌ์ฉ์๋ง ํํฐ๋ง
๐ ์กฐ๊ฑด์ ๋ง๋ userKeyword.id์ ๊ฐ์๋ฅผ count๋ก ๊ณ์ฐ
๐ keywordCount๋ผ๋ alias๋ก ์ธ๋ถ ์ฟผ๋ฆฌ์ ์ ๋ฌ
2๏ธโฃ ์ธ๋ถ ์ฟผ๋ฆฌ
๐ userKeyword → keyword → user ํ
์ด๋ธ์ ์กฐ์ธ
๐ ๋์ผํ ์ฐ๋ น ํํฐ๋ฅผ ํ๋ฒ ๋ ์ํ
๐ keyword.id, keyword.name์ ๊ธฐ์ค์ผ๋ก group by ์ํ
๐ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ ํค์๋ ์์ผ๋ก ์ ๋ ฌ (order by count desc)
๐ ์์ 10๊ฐ๋ง ์กฐํ (limit 10)
๐ ๏ธ ๊ฐ์ ์ ๋ต ์๋ฆฝ
๐ฏ ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ๋ ๊ฐ์ง ๊ณํ
1๏ธโฃ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ , ๋จ์ผ ์ฟผ๋ฆฌ๋ก ์ง๊ณ ์ต์ ํ
๐ ์ค๋ณต๋ ์กฐ์ธ๊ณผ ํํฐ๋ง ์ ๊ฑฐ
๐ ์ฟผ๋ฆฌ ์คํ ํ์ ์ต์ํ
๐ ์๋ต ์๋ ๊ฐ์ ๊ธฐ๋
2๏ธโฃ user.age ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ฌ WHERE ์กฐ๊ฑด์ ์ฑ๋ฅ ๊ฐ์
๐ Full Scan → Index Scan ์ ํ
๐ ํํฐ๋ง ์๋ ํฅ์ ์์
๊ฐ ์ ๋ต์ ๋ณ๋๋ก ์คํํ๋ฉฐ ํจ๊ณผ๋ฅผ ์ธก์ ํ๊ณ , ์ค์ ๊ฐ์ ์์น๋ก ์ ์ฉ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ๋ก ํ๋ค.
โ 1๋จ๊ณ: ์๋ธ ์ฟผ๋ฆฌ ์ ๊ฑฐ → ๋จ์ผ ์ฟผ๋ฆฌ๋ก ๋ฆฌํฉํ ๋ง
๊ธฐ์กด ์๋ธ ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด QueryDSL์ NumberTemplate์ ํ์ฉํ์ฌ ๋จ์ผ ์ฟผ๋ฆฌ ๋ด์์ ์ง๊ณ๋ฅผ ๋ฐ๋ก ์ํํ ์ ์๋๋ก ๋ฆฌํฉํ ๋งํ๋ค.
๐งช ํ ์คํธ ๊ฒฐ๊ณผ
ํญ๋ชฉ | ๋ณ๊ฒฝ ์ | ๋ณ๊ฒฝ ํ |
์คํ ์๊ฐ | 31.49s | 146ms |
์๋ฌ ๋ฐ์ ๋น์จ | 90% | 0% |
๐ ์๋ธ ์ฟผ๋ฆฌ ์ ๊ฑฐ๋ง์ผ๋ก๋ ์๋ต ์๋๋ ์ฝ 215๋ฐฐ ํฅ์, ์๋ฒ ํ์์์/์๋ฌ ๋ชจ๋ ํด๊ฒฐ๋์๋ค!
๋ณต์กํ ์๋ธ ์ฟผ๋ฆฌ๋ณด๋ค ๋จ์ผ ์ฟผ๋ฆฌ์ ๋ช ํํ Group By๊ฐ ํจ์ฌ ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ผ๋ ๊ฑธ ์ง์ ์ฒด๊ฐํ๋ค.
โ 2๋จ๊ณ: user.age์ ์ธ๋ฑ์ค ์ ์ฉํด๋ณด๊ธฐ
์๋ธ ์ฟผ๋ฆฌ ์ ๊ฑฐ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ฑ๋ฅ์ด ๊ฐ์ ๋์์ง๋ง, ์ถ๊ฐ์ ์ธ ์ต์ ํ๋ฅผ ์ํด user.age ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํด๋ดค๋ค.
CREATE INDEX idx_user_age ON user (age);
๐ ์คํ ๊ณํ ์ ํ ๋น๊ต ์์ฝ
ํญ๋ชฉ | ์ธ๋ฑ์ค ์ | ์ธ๋ฑ์ค ํ | ๊ฐ์ ๋ด์ฉ |
user ํ ์ด๋ธ ์กฐํ ๋ฐฉ์ | Full table Scan(ALL) | Index Range Scan(range) | ํํฐ ์ฑ๋ฅ ๊ฐ์ |
์คํ ์๊ฐ | 62.5ms | 52.4ms | ์ฝ 16% ๊ฐ์ |
๋ถํ ํ ์คํธ | ํ๊ท 50ms | 50ms | ๊ฐ์ ์ฒด๊ฐ ๋ฏธ๋ฏธ |
๐ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ ๊ฒฐ๊ณผ, ์คํ ๊ณํ ์์์๋ ๊ฐ์ ์ด ํ์ธ๋์์ง๋ง ๋ถํ ํ๊ฒฝ์์๋ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ์ฒด๊ฐํ๊ธฐ ์ด๋ ค์ ๋ค.
๐ค ๊ทธ๋ฐ๋ฐ... ์ธ๋ฑ์ค๋ฅผ ์ ์งํด์ผ ํ ๊น?
user ํ ์ด๋ธ์ ์ฌ์ฉ์ ๊ฐ์ ์๋ง๋ค ์ง์์ ์ผ๋ก INSERT ๋ฐ์ํ๋ ๊ตฌ์กฐ์ด๋ค.
๊ทธ๋ฐ๋ฐ age ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด?!
โ ๏ธ ์ฝ์
/๊ฐฑ์ ์ด ๋ฐ์ํ ๋๋ง๋ค ์ธ๋ฑ์ค๋ฅผ ์ ๋ ฌ & ์ฌ์ ๋ ฌ
โ ๏ธ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์ธ๋ฑ์ค ์ ์ง ๋น์ฉ์ด ์ฆ๊ฐ
โ ๏ธ ์ฐ๊ธฐ ์ฑ๋ฅ์ด ์ ํ๋ ๊ฐ๋ฅ์ฑ๋ ๋ฐฐ์ ํ ์ ์๋ค.
์ฝ๊ธฐ ์ฑ๋ฅ์ ๋นํด ์ฐ๊ธฐ ๋ถ๋ด์ด ์ปค์ง ์ ์๋ ์ํฉ์ด๋ค!
๐ ์ด๋ฏธ ์ฟผ๋ฆฌ ์ต์ ํ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ฑ๋ฅ ํฅ์์ ํ๋ณดํ๊ธฐ ๋๋ฌธ์,
๐ ์ธ๋ฑ์ค๋ฅผ ๊ตณ์ด ์ ์งํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
โ ๊ฒฐ๋ก ๋ฐ ํ๊ณ
์ด๋ฒ ์ฑ๋ฅ ๊ฐ์ ์์ ์ผ๋ก ์๋ธ ์ฟผ๋ฆฌ ์ ๊ฑฐ๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ต์ ํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์๋ค.
๐ก ํต์ฌ ์ ๋ฆฌ
โ
๋ณต์กํ ์๋ธ ์ฟผ๋ฆฌ → ๋จ์ผ ์ฟผ๋ฆฌ๋ก ๋ฆฌํฉํ ๋ง
๐ ์คํ ์๊ฐ 31.49์ด → 146ms, ์ฝ 215๋ฐฐ ์๋ ๊ฐ์
โ
JMeter ๋ถํ ํ
์คํธ ํต๊ณผ
๐ 100 ์ค๋ ๋ ๊ธฐ์ค, ์๋ฌ์จ 0% ์ ์ง
โ๏ธ ์ธ๋ฑ์ค ์ ์ฉ์ ์ ์ ์ธํ์๊น?
๐ user.age ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์ ์คํ ๊ณํ ์ ์ผ๋ถ ์ฑ๋ฅ ๊ฐ์ ํจ๊ณผ๋ ์์์ง๋ง ์ฐ๊ธฐ ์ฐ์ฐ ์ ์ ๋ ฌ/์ฌ์ ๋ ฌ ๋น์ฉ๊ณผ ๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ ์ง ๋น์ฉ์ ๊ณ ๋ คํ ๋ ์ฅ๊ธฐ์ ์ผ๋ก ์ ์ํฅ์ ์ค ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ํ๋จํ๋ค.