-
Notifications
You must be signed in to change notification settings - Fork 5
Query Optimization (1)
DB ์์คํ ์ด๋ ์ธ๋ฑ์ค, ์ฟผ๋ฆฌ ๋ฑ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ๋ ์์๋ค์ด ๋ง์ ๊ฒ์ผ๋ก ์๊ฐ๋จ. DB ์์คํ ํ๋์ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ฒ์ DBA์ ์ ๋ฌด๊ฒ ์ง๋ง, ์ฑ๋ฅ์ ์ ํ์ํค์ง ์๋ ์ข์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฐ๋ฐ์์ ์ ๋ฌด์ธ ๊ฒ ๊ฐ๋ค.
WATCHA ๊ธฐ์ ๋ธ๋ก๊ทธ: ์ฟผ๋ฆฌ ์ต์ ํ: ๋น ๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์ํ 7๊ฐ์ง ์ฒดํฌ๋ฆฌ์คํธ โ
-
SELECT์ ํ์ํ ์ต์ํ์ ์ปฌ๋ผ๋ง์ ๊ฐ์ ธ์ค๊ธฐ
๊ฒ์๊ธ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฒญ์์post.content
๋ฑ ๋ถํ์ํ ์ปฌ๋ผ์ ๊ฐ์ ธ์ค์ง ์๋๊ฒ ์ข์. ๋ฆฌ์คํธ์์ ์ฌ์ฉํ ์ปฌ๋ผ๋ง์ ๊ฐ์ ธ์ค๊ธฐ. -
์กฐ๊ฑด ์ฐ์ฐ์ Index ๊ฐ์ ์ฌ์ฉํ ์ ์๋๋ก ๊ธฐ์กด ์ปฌ๋ผ ๊ฐ์ ๋ณ๋์ ์ฐ์ฐ ๊ฑธ์ง ์๊ธฐ
์์น ํํฐ๋ง์ ์ํด ์๋, ๊ฒฝ๋๋ฅผ ์ฌ์ฉํด ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ํ๊ฒ ๋๋ฉด ์ปฌ๋ผ ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์ ๊ณฑ ๋ฑ์ ๊ณ์ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋จ. ๊ฐ๋ฅํ๋ค๋ฉด ์ปฌ๋ผ ๊ฐ์ ์ฐ์ฐ์ด ๋ค์ด๊ฐ์ง ์๋๋ก ๊ณ ๋ฏผํด๋ณด๊ธฐ. -
LIKE ์ฌ์ฉ์ ๋ฌธ์์ด ์๋ถ๋ถ์๋ % ๋ฃ์ง ์๊ธฐ
๊ฒ์์ด ํํฐ๋ง์%๊ฒ์์ด%
์ ๊ฐ์ด ๊ฒ์ํ๊ณ ์๋๋ฐ, ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น? -
์ค๋ณต ๊ฐ ์ ๊ฑฐ ์ฐ์ฐ ์ฌ์ฉ ์ง์ํ๊ธฐ (SELECT DISTINCT, UNION DISTINCT ๋ฑ)
์ค๋ณต ๊ฐ ์ ๊ฑฐ ์ฐ์ฐ์ Cost๊ฐ ํผ. ์ค๋ณต ์ ๊ฑฐ ์ฐ์ฐ์ด ํ์ํ๋ค๋ฉด EXISTS ํ์ฉ ๋ฑ ๋์ฒด ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด๋ณผ ๊ฒ. -
GROUP BY์ WHERE๋ก ํด๊ฒฐํ ์ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด HAVING ์ฌ์ฉํ์ง ์๊ธฐ
WHERE๋ฅผ ํตํด ๋ฐ์ดํฐ ํฌ๊ธฐ๋ฅผ ์ค์ฌ๋์ผ๋ฉด GROUP BY ์ฐ์ฐ์ ๋์์ด ๋จ. -
3๊ฐ ์ด์์ ํ ์ด๋ธ JOIN์ ๊ฐ์ฅ ํฐ ํ ์ด๋ธ์ FROM์ ๋ฐฐ์นํ๊ณ ๋๋จธ์ง๋ ํฌ๊ธฐ๊ฐ ์์ ์์ผ๋ก JOIN
์ฟผ๋ฆฌ ํ๋๋ ์๊ฐ์ ์ค์ฌ์ค ์ ์์ผ๋, ํญ์ ํจ๊ณผ๊ฐ ์๋ ๊ฒ์ ์๋. -
์์ฃผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ ๋ฏธ๋ฆฌ ์ ์ฒ๋ฆฌ๋ ํ ์ด๋ธ์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ ์ ์์
RDBMS์ ์์น์๋ ์ด๊ธ๋ ์ ์๋ ๋ฐฉ๋ฒ์.
-
post
,category
,participant
ํ ์ด๋ธ์ด ํ์ - ์นดํ
๊ณ ๋ฆฌ์ ์ด๋ฆ์ ๋ฐํํด์ผํจ (
category.name
) - ๊ฒ์๊ธ๋ง๋ค ์ฐธ์ฌ์์ ์๋ฅผ ๋ฐํํด์ผํจ (
participant
์์postId
๋ก ๊ฒ์์์ count)
์ฐ์ post
์ category
ํ
์ด๋ธ๋ง์ ์กฐ์ธํด ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์จ๋ค์,
๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉฐ ๊ฒ์๊ธ ๊ฐ๊ฐ participant
ํ
์ด๋ธ์์ ๊ฒ์ํ๊ณ ์์
const posts = await postService.getPosts(req.query as getPostsOption);
const result = await Promise.all(
posts.map(async (post: any) => {
const [participant, participantCnt] =
await participantService.getParticipantNum(post.id);
post.participantCnt = participantCnt;
return post;
})
);
LIMIT์ด 20์ธ๊ฒฝ์ฐ, API ์์ฒญ์ด ๋ค์ด์ฌ๋๋ง๋ค DB์์๋ 21๋ฒ์ I/O๊ฐ ๋ฐ์ํ์ฌ ์๋ ์ ํ ์ฐ๋ ค๊ฐ ์์
GROUP BY
๋ฅผ ํ์ฉ, ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ฐธ์ฌ์ ์๋ฅผ ํฌํจํ ๊ฒ์๊ธ ๋ฆฌ์คํธ๋ฅผ ์ป์ ์ ์์
select post.id, title, capacity, deadline, c.name as category, count(p.userId) as joined
from post
left join category c
on post.categoryId = c.id
left join participant p
on post.id = p.postId
group by id
limit 20;
๊ธฐ์กด ๋ฐฉ๋ฒ | ๊ฐ์ ํ ๋ฐฉ๋ฒ |
---|---|
|
|
ํ๊ท 204.3908ms | ํ๊ท 125.7054ms |
- IntersectionObserver
- B-Tree
- Web Server & Web Application Server
- Query Optimization (1)
- Query Optimization (2)
- M1 Mac์์ link preview generator ์ค์น ์ค ๋ฐ์ํ๋ ์ค๋ฅ
- CORS
- react-router-dom
- Artillery: Performance testing tool
- JWT
- LinkPreview
- SWR
- ์ฟผ๋ฆฌ์ฑ๋ฅํฅ์&๋ฌดํ์คํฌ๋กค
- 10์ 26์ผ ํ์์ผ
- 10์ 27์ผ ์์์ผ
- 10์ 28์ผ ๋ชฉ์์ผ
- 11์ 1์ผ ์์์ผ
- 11์ 2์ผ ํ์์ผ
- 11์ 3์ผ ์์์ผ
- 11์ 4์ผ ๋ชฉ์์ผ
- 11์ 9์ผ ํ์์ผ
- 11์ 10์ผ ์์์ผ
- 11์ 11์ผ ๋ชฉ์์ผ
- 11์ 16์ผ ํ์์ผ
- 11์ 17์ผ ์์์ผ
- 11์ 18์ผ ๋ชฉ์์ผ
- 11์ 23์ผ ํ์์ผ
- 11์ 24์ผ ์์์ผ
- 11์ 25์ผ ๋ชฉ์์ผ
- 11์ 30์ผ ํ์์ผ
- 12์ 1์ผ ์์์ผ
- 12์ 2์ผ ๋ชฉ์์ผ