โ๐[Backend Development] Path Enumeration ๋ฐฉ์์์ ๋๊ธ์ ๊ฒฝ๋ก(Path) ๊ฒฐ์ ๊ณผ์ .โ
โ 1๏ธโฃ ๋๊ธ ํธ๋ฆฌ ๊ตฌ์กฐ์์ ์๋ก์ด ๋๊ธ์ path ๊ฒฐ์ ํ๊ธฐ
- Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์ ์ฌ์ฉํ ๋, ์๋ก์ด ๋๊ธ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ ํด๋น ๋๊ธ์ path๋ฅผ ๊ฒฐ์ ํ๋ ๊ณผ์ ์ด ์ค์ํฉ๋๋ค.
- ๋๊ธ์ ๋ถ๋ชจ ๋๊ธ์ path๋ฅผ ์์๋ฐ์ผ๋ฉฐ, ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ ๋๊ธ์ path๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ก์ด path๊ฐ ์์ฑ๋ฉ๋๋ค.
๐1๏ธโฃ ๊ธฐ์กด ๋๊ธ ํธ๋ฆฌ ๊ตฌ์กฐ.
- ์๋ก์ด ๋๊ธ์ด ์ถ๊ฐ๋๊ธฐ ์ ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
- ์ต์์ ๋๊ธ 00a0z๊ฐ ์๊ณ , ํ์ ๋๊ธ๋ค์ด ๊ณ์ธต์ ์ผ๋ก ์กด์ฌํฉ๋๋ค.
- path๋ ๋ถ๋ชจ ๋๊ธ์ path๋ฅผ ์์๋ฐ์ ์์ฑ๋๋ฉฐ, ๋๊ธ์ด ์ถ๊ฐ๋ ์๋ก ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค.
๐2๏ธโฃ ์๋ก์ด ๋๊ธ ์ถ๊ฐ ์์ฒญ.
- ์ด๋ค ์ฌ์ฉ์ฌ์ฉ์๊ฐ 00a0z ๋๊ธ์ ํ์์ ์๋ก์ด ๋๊ธ์ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
- ํ์ง๋ง, ํ์ฌ 00a0z์ ํ์ ๋๊ธ๋ค์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด path๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
- ํ์ฌ 00a0z์ ํ์ ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path(childernTopPath)๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
๐3๏ธโฃ childrenTopPath ์ฐพ๊ธฐ
- ์๋ก์ด ๋๊ธ์ ์ถ๊ฐํ ๋๋, ํ์ฌ ์กด์ฌํ๋ ํ์ ๋๊ธ ์ค ๊ฐ์ฅ ํฐ path(childrenTopPath)๋ฅผ ์ฐพ๊ณ ํด๋น ๊ฐ์ +1์ ํ์ฌ ์๋ก์ด ๋๊ธ์ path๋ฅผ ์์ฑํฉ๋๋ค..
- ํ์ฌ 00a0z์ ํ์ ๋๊ธ ์ค์์ ๊ฐ์ฅ ํฐ path๋ 00a0z 00002์ ๋๋ค.
- ๋ฐ๋ผ์, ์๋ก์ด ๋๊ธ์ path๋ 00a0z 00003์ด ๋ฉ๋๋ค.
โ 2๏ธโฃ Path Enumeration ๋ฐฉ์์์ ์ธ๋ฑ์ค ํ์ฉ
- Path Enumeration ๋ฐฉ์์์๋ ๋น ๋ฅธ ๊ฒ์์ ์ํด ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
- ํนํ descendantsTopPath๋ฅผ ์ฐพ์ ๋ Backward Index Scan์ ์ฌ์ฉํ๋ฉด ๋น ๋ฅธ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๐1๏ธโฃ descendantsTopPath๋ฅผ ์ฐพ๋ ๊ณผ์ .
- ์๋ก์ด ๋๊ธ์ ์ถ๊ฐํ ๋, ๊ฐ์ฅ ํฐ descendantsTopPath๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
- path ์ ๋ ฌ ์ํ๋ฅผ ์ ์งํ๋ฉด์ ์ญ์์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ํ์ํ๋ฉด, ๊ฐ์ฅ ํฐ path(descendantsTopPath)๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
- Backward Index Scan์ ํ์ฉํ๋ฉด ๋ก๊ทธ ์๊ฐ(log time) ๋ด์ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋จผ์ ์๋์ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ descendantsTopPath๋ฅผ DB์์ ์ฐพ์ ์ ์์ต๋๋ค:
SELECT path FROM comment_v2
WHERE article_id = {article_id}
AND path > {parentPath} // parent ๋ณธ์ธ์ ๋ฏธํฌํจ ๊ฒ์ ์กฐ๊ฑด
AND path like {parentPath}% // parentPath๋ฅผ prefix๋ก ํ๋ ๋ชจ๋ ์์ ๊ฒ์ ์กฐ๊ฑด
ORDER BY path DESC LIMIT 1; // ์กฐํ ๊ฒฐ๊ณผ์์ ๊ฐ์ฅ ํฐ path
๐2๏ธโฃ Backward Index Scan ํ์ฉ
- path ํ๋์ ์ค๋ฆ์ฐจ์(ASC) ์ธ๋ฑ์ค๊ฐ ์ค์ ๋์ด ์์ด๋, ๋ด๋ฆผ์ฐจ์(DESC) ์ ๋ ฌ์ ํตํด ๊ฐ์ฅ ํฐ path๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
- ์ธ๋ฑ์ค ํธ๋ฆฌ(Leaf Node) ๊ฐ์ ์๋ฐฉํฅ ํฌ์ธํฐ๋ฅผ ํ์ฉํ์ฌ ์ญ์ ๊ฒ์์ ์ํํฉ๋๋ค.
- ์ญ์์ผ๋ก ์ค์บํ์ฌ LIMIT 1์ ์ ์ฉํ๋ฉด ๊ฐ์ฅ ํฐ path๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
โ 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 ๋ถ์ ๊ฒฐ๊ณผ
-
-
idx_article_id_path ์ธ๋ฑ์ค ์ฌ์ฉ๋จ
- โ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ path๋ฅผ ์กฐํํ ์ ์์
-
idx_article_id_path ์ธ๋ฑ์ค ์ฌ์ฉ๋จ
-
-
Backward Index Scan ์ ์ฉ๋จ
- โ ORDER BY path DESC LIMIT 1์ ํตํด ์ญ์ ํ์ ์ํ
-
Backward Index Scan ์ ์ฉ๋จ
-
-
Using Index ์ ์ฉ๋จ
- โ ์ธ๋ฑ์ค์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ต์ ํ ๊ฐ๋ฅ
-
Using Index ์ ์ฉ๋จ
โ 4๏ธโฃ ๊ฒฐ๋ก
๐ Path Enumeration(๊ฒฝ๋ก ์ด๊ฑฐ) ๋ฐฉ์์์ ๋๊ธ์ ์ถ๊ฐํ ๋, path๋ฅผ ๊ฒฐ์ ํ๋ ๊ณผ์ .
- โ ๊ฐ์ฅ ํฐ childrenTopPath๋ฅผ ์ฐพ๊ณ , +1์ ํ์ฌ ์๋ก์ด path๋ฅผ ์์ฑ
- โ descendantsTopPath๋ฅผ ์ฐพ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ๋๊ธ์ ์ ๋ ฌ
- โ MySQL์ Backward Index Scan์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ descendantsTopPath๋ฅผ ๊ฒ์
- โ ๋๊ท๋ชจ ๋ฐ์ดํฐ์์๋ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅธ ์ฑ๋ฅ์ ์ ์ง
๐ Path Enumeration ๋ฐฉ์์ ์ฌ์ฉํ ๋๋, Backward Index Scan์ ํ์ฉํ์ฌ ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.