βπ[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μ νμ©νμ¬ μ΅μ μ μ±λ₯μ 보μ₯νλ κ²μ΄ μ€μν©λλ€.