โ๐[Backend Development] ๋ฌดํ Depth ๋๊ธ ์กฐํ - Path Enumeration & ์ธ๋ฑ์ค ์ต์ ํโ
โ 1๏ธโฃ Path Enumeration ๋ฐฉ์์์ ๋๊ธ path ๊ฒฐ์
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ ๊ฐ ๋๊ธ์ path๋ฅผ ๊ณ์ธต์ ์ผ๋ก ์ ์ฅํ์ฌ ์ ๋ ฌ ๋ฐ ๊ฒ์์ ๋น ๋ฅด๊ฒ ์ํํ๋ ๊ธฐ๋ฒ์ ๋๋ค.
- ๋๊ธ์ด ์ถ๊ฐ๋ ๋ ๋ถ๋ชจ ๋๊ธ์ path๋ฅผ ์์๋ฐ๊ณ , ํ์ ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ก์ด path๊ฐ ๊ฒฐ์ ๋ฉ๋๋ค.
๐1๏ธโฃ ํ์ฌ ๋๊ธ ํธ๋ฆฌ ๊ตฌ์กฐ
- ํ์ฌ ๋๊ธ ํธ๋ฆฌ์ path๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- 00a0z ๋๊ธ ์๋์ ๊ณ์ธต์ ์ผ๋ก ์ ๋ ฌ๋ ํ์ ๋๊ธ๋ค์ด ์์ต๋๋ค.
- ๋๊ธ์ path๋ ๋ถ๋ชจ ๋๊ธ์ path๋ฅผ ์์๋ฐ์ 00000, 00001, 00002 ๋ฑ์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค.
๐2๏ธโฃ ์๋ก์ด ๋๊ธ ์ถ๊ฐ ์์ฒญ
- ์ฌ์ฉ์๊ฐ 00a0z ๋๊ธ์ ํ์์ ์๋ก์ด ๋๊ธ์ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
- ์๋ก์ด ๋๊ธ์ด ์ถ๊ฐ๋ path๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
- ๊ธฐ์กด ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path๋ฅผ ์ฐพ์ ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก +1์ ์ ์ฉํ์ฌ ์๋ก์ด path๋ฅผ ์์ฑํฉ๋๋ค.
๐3๏ธโฃ childrenTopPath ์ฐพ๊ธฐ
- ์๋ก์ด ๋๊ธ์ ์ถ๊ฐํ ๋ ํ์ฌ ์กด์ฌํ๋ ํ์ ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path(childrenTopPath)๋ฅผ ์ฐพ๊ณ ํด๋น ๊ฐ์ +1์ ํ์ฌ ์๋ก์ด ๋๊ธ์ path๋ฅผ ์์ฑํฉ๋๋ค.
- ํ์ฌ 00a0z์ ํ์ ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path๋ 00a0z 00002์ ๋๋ค.
- ๋ฐ๋ผ์, ์๋ก์ด ๋๊ธ์ path๋ 00a0z 00003์ด ๋ฉ๋๋ค.
๐4๏ธโฃ descendantsTopPath๋ฅผ ๊ณ ๋ คํ ์ต์ข path ๊ฒฐ์
- ํ์ง๋ง ์์ ๋๊ธ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๋จ์ํ childrenTopPath๋ง ๊ณ ๋ คํ๋ฉด ์ ๋ฉ๋๋ค. ๊ฐ์ฅ ๊น์ depth๊น์ง ๊ณ ๋ คํ descendantsTopPath๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
- descendantsTopPath๋ ๋ถ๋ชจ ๋๊ธ์ ํฌํจํ ๋ชจ๋ ์์ ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path์ ๋๋ค.
- childrenTopPath = 00a0z 00002์ด๋ฏ๋ก, ์๋ก์ด ๋๊ธ์ path๋ 00a0z 00003์ด ๋ฉ๋๋ค.
โ 2๏ธโฃ MySQL์์ descendantsTopPath ์ฐพ๊ธฐ.
- Path Enumeration ๋ฐฉ์์์๋ ๋น ๋ฅธ ๊ฒ์์ ์ํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ํนํ descendantsTopPath๋ฅผ ์ฐพ์ ๋ Backward Index Scan์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
๐1๏ธโฃ descendantsTopPath๋ฅผ ์ฐพ๋ SQL
SELECT path FROM comment_v2
WHERE article_id = {article_id}
AND path > {parentPath} -- ๋ถ๋ชจ ๋๊ธ ์ ์ธ
AND path LIKE {parentPath}% -- ๋ถ๋ชจ ๋๊ธ prefix๋ฅผ ํฌํจํ๋ ๋ชจ๋ ์์ ๋๊ธ ์กฐํ
ORDER BY path DESC LIMIT 1; -- ๊ฐ์ฅ ํฐ path๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ๊ฐ์ฅ ํฐ path(descendantsTopPath)๋ฅผ ์ฐพ์ ๋ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํ์ฉํฉ๋๋ค.
- LIMIT 1์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
๐2๏ธโฃ Backward Index Scan ํ์ฉ
- MySQL์์๋ ORDER BY path DESC๋ฅผ ์ฌ์ฉํ ๋ ์ญ์์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ํ๋ Backward Index Scan์ ์ํํฉ๋๋ค.
- path ํ๋์ ์ค๋ฆ์ฐจ์(ASC) ์ธ๋ฑ์ค๊ฐ ์ค์ ๋์ด ์์ด๋, ๋ด๋ฆผ์ฐจ์(DESC) ์ ๋ ฌ์ ํตํด ๊ฐ์ฅ ํฐ path๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
- ์ธ๋ฑ์ค ํธ๋ฆฌ(Leaf Node) ๊ฐ์ ์๋ฐฉํฅ ํฌ์ธํฐ๋ฅผ ํ์ฉํ์ฌ ์ญ์ ๊ฒ์์ ์ํํฉ๋๋ค.
โ 3๏ธโฃ MySQL Query Plan ๋ถ์(EXPLAIN)
- MySQL์์ descendantsTopPath๋ฅผ ์ฐพ๋ ์ฟผ๋ฆฌ์ ์คํ ๊ณํ์ ๋ถ์ํด๋ด ๋๋ค.
EXPLAIN SELECT path FROM comment_v2
WHERE article_id = 1
AND path > '00a0z'
AND path LIKE '00a0z%'
ORDER BY path DESC LIMIT 1;
๐EXPLAIN ๊ฒฐ๊ณผ ๋ถ์
-
1.idx_article_id_path ์ธ๋ฑ์ค ์ฌ์ฉ๋จ
- โ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ path๋ฅผ ์กฐํํ ์ ์์
-
2. Backward Index Scan ์ ์ฉ๋จ
- โ ORDER BY path DESC LIMIT 1์ ํตํด ์ญ์ ํ์ ์ํ
-
3. Using Index ์ ์ฉ๋จ
- โ ์ธ๋ฑ์ค์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ
โ 4๏ธโฃ descendantsTopPath๋ฅผ ํ์ฉํ ์ ๋ ฌ ์ต์ ํ
- Path Enumeration ๋ฐฉ์์์๋ ์ ๋ ฌ ์ํ๋ฅผ ์ ์งํ ์ฑ descendantsTopPath๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
- path ์ ๋ ฌ ์ํ๋ฅผ ์ ์งํ๋ฉด์ ์ญ์์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ํ๋ฉด, ๊ฐ์ฅ ํฐ path(descendantsTopPath)๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
- Backward Index Scan์ ํ์ฉํ๋ฉด ๋ก๊ทธ ์๊ฐ(log time) ๋ด์ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
โ 5๏ธโฃ ๊ฒฐ๋ก
๐ Path Enumeration ๋ฐฉ์์์ ๋๊ธ์ ์ถ๊ฐํ ๋, path๋ฅผ ๊ฒฐ์ ํ๋ ๊ณผ์ .
- โ ๊ฐ์ฅ ํฐ childrenTopPath๋ฅผ ์ฐพ๊ณ , +1์ ํ์ฌ ์๋ก์ด path๋ฅผ ์์ฑ
- โ descendantsTopPath๋ฅผ ์ฐพ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ๋๊ธ์ ์ ๋ ฌ
- โ MySQL์ Backward Index Scan์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ descendantsTopPath๋ฅผ ๊ฒ์
- โ ๋๊ท๋ชจ ๋ฐ์ดํฐ์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ์ง
๐ Path Enumeration ๋ฐฉ์์ ์ฌ์ฉํ ๋๋, Backward Index Scan์ ํ์ฉํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์.