R-Tree index

MySQLμ—λŠ” 곡간 인덱슀(Spatial Index)κ°€ μ‘΄μž¬ν•œλ‹€. 곡간 μΈλ±μŠ€λŠ” R-Tree 인덱슀 μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ 2μ°¨μ›μ˜ 데이터λ₯Ό μΈλ±μ‹±ν•˜κ³  κ²€μƒ‰ν•˜λŠ” λͺ©μ μ˜ μΈλ±μŠ€μ΄λ‹€.

기본적인 λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μ€ B-Tree와 ν‘μ‚¬ν•œλ°, B-TreeλŠ” 인덱슀λ₯Ό κ΅¬μ„±ν•˜λŠ” 컬럼의 값이 1차원 μŠ€μΉΌλΌμ΄μ§€λ§Œ, R-Tree μΈλ±μŠ€λŠ” 2μ°¨μ›μ˜ 곡간 κ°œλ… 값이닀.

슀마트폰이 λŒ€μ€‘ν™”λ˜λ©΄μ„œ GIS, GPS 기반의 μ„œλΉ„μŠ€κ°€ ν™•μž₯되고 μžˆλ‹€. μ΄λŸ¬ν•œ μœ„μΉ˜ 기반의 μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 λ§Žμ§€λ§Œ MySQL의 곡간 ν™•μž₯(Spatial Extenstions)을 μ΄μš©ν•˜λ©΄ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

MySQL 곡간 ν™•μž₯μ—λŠ” μ„Έ κ°€μ§€ κΈ°λŠ₯이 포함돼 μžˆλ‹€.

  • 곡간 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 데이터 νƒ€μž…

  • 곡간 λ°μ΄ν„°μ˜ 검색을 μœ„ν•œ 곡간 인덱슀(R-Tree (Range Tree) μ•Œκ³ λ¦¬μ¦˜)

  • 곡간 λ°μ΄ν„°μ˜ μ—°μ‚° ν•¨μˆ˜(거리 or 포함 κ΄€κ³„μ˜ 처리) μ—¬κΈ°μ„œλŠ” R-Tree μ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•΄μ„œλ§Œ ν•™μŠ΅ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.

ꡬ쑰 및 νŠΉμ„±

MySQL은 곡간 μ •λ³΄μ˜ μ €μž₯κ³Ό 검색을 μœ„ν•΄ μ—¬λŸ¬ κ°€μ§€ κΈ°ν•˜ν•™μ  λ„ν˜•(Geometry) 정보λ₯Ό 관리할 수 μžˆλŠ” 데이터 νƒ€μž…μ„ μ œκ³΅ν•œλ‹€. MySQLμ—μ„œλŠ” 크게 두 κ°€μ§€ μΉ΄ν…Œκ³ λ¦¬λ‘œ λ‚˜λ‰œλ‹€.

  1. 단일 κΈ°ν•˜ν•™μ„ μ €μž₯ν•˜λŠ” νƒ€μž…:

    • Point, Line, Polygon, Geometry

  2. μ—¬λŸ¬ κΈ°ν•˜ν•™μ˜ κ°’μ˜ μ»¬λ ‰μ…˜μ„ μ €μž₯ν•˜λŠ” μ»¬λ ‰μ…˜ νƒ€μž…:

    • Multi-Point, Multi-Line, Multi-Polygon, GeometryCollection

λŒ€ν‘œμ μœΌλ‘œ MySQLμ—μ„œ μ§€μ›ν•˜λŠ” 곡간 데이터 νƒ€μž…(Spatial Data Type)은 μ•„λž˜μ™€ κ°™λ‹€.

Goemetry νƒ€μž…μ€ λͺ¨λ“  μ’…λ₯˜μ˜ 곡간 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 일반적인 νƒ€μž…μœΌλ‘œ, κΈ°ν•˜ν•™ 값도 μ €μž₯ν•  수 μžˆλ‹€. 즉, POINT, LINE, POLYGON 객체도 μ €μž₯ν•  수 μžˆλ‹€. (= GeomCollection도 동일)

MBR(Minimum Bounding Rectangle): μ΅œμ†Œ 경계 μ‚¬κ°ν˜•

곡간 정보 검색을 μœ„ν•œ R-Treeλ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” MBR κ°œλ…μ„ μ•Œμ•„μ•Ό ν•œλ‹€. (핡심이닀!)

MBR은 νŠΉμ • λ„ν˜•μ„ κ°μ‹ΈλŠ” μ΅œμ†Œ 크기의 μ‚¬κ°ν˜•μ„ μ˜λ―Έν•œλ‹€. μ—¬κΈ°μ„œ β€œνŠΉμ • λ„ν˜•β€μ€ MySQLμ—μ„œ μ œκ³΅ν•˜λŠ” 곡간 데이터 νƒ€μž…μœΌλ‘œ, κΈ°ν•˜ν•™μ  객체λ₯Ό μ˜λ―Έν•œλ‹€.

μ•„λž˜ 그림을 톡해 확인해 보자.

R-Tree μžλ£Œκ΅¬μ‘°λŠ” B-Tree 와 ν‘μ‚¬ν•œ ν˜•νƒœλ‘œ κ΅¬μ„±λ˜μ–΄μžˆλ‹€. λ”°λΌμ„œ λ„ν˜•μ΄ μ €μž₯됐을 λ•Œ λ§Œλ“€μ–΄μ§€λŠ” 인덱슀 ꡬ쑰λ₯Ό 이해해야 ν•œλ‹€. λ„ν˜•μ„ 레벨둜 λ‚˜λˆ λ³΄μž.

  • μ΅œμƒμœ„ 레벨: X, Y

  • μ΅œν•˜μœ„ 레벨: A, B, C, D, E

μ΅œμƒμœ„ MBR은 R-Tree의 루트 λ…Έλ“œμ— μ €μž₯λ˜λŠ” 정보이며, μ΅œν•˜μœ„ λ ˆλ²¨μ€ 리프 λ…Έλ“œκ°€ λœλ‹€.

  • 또, 쀑간 레벨이 μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ MBR은 브랜치 λ…Έλ“œκ°€ λœλ‹€.

R-Tree 인덱슀의 μš©λ„

R-TreeλŠ” MBR 정보λ₯Ό μ΄μš©ν•΄ B-Tree ν˜•νƒœλ‘œ 인덱슀λ₯Ό κ΅¬μΆ•ν•˜λ―€λ‘œ Rectangle의 β€˜R’과 B-Treeλ₯Ό μ„žμ–΄μ„œ 이름을 λΆ™μ˜€μœΌλ©°, 곡간(Spatial) 인덱슀라고 ν•œλ‹€. 일반적으둜 WGS84(GPS) κΈ°μ€€μ˜ μœ„λ„, 경도 μ’Œν‘œ μ €μž₯에 주둜 μ‚¬μš©λœλ‹€.

또, μœ„ κ·Έλ¦Όκ³Ό 같이 R-TreeλŠ” λ„ν˜•μ˜ 포함 관계λ₯Ό μ΄μš©ν•΄ λ§Œλ“  μΈλ±μŠ€μ΄λ‹€. ST_Contains() λ˜λŠ” ST_Within() λ“±κ³Ό 같은 포함 관계λ₯Ό λΉ„κ΅ν•˜λŠ” ν•¨μˆ˜λ‘œ 검색을 μˆ˜ν–‰ν•˜λŠ” κ²½μš°μ—λ§Œ 인덱슀λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

λŒ€ν‘œμ μœΌλ‘œλŠ” β€˜ν˜„μž¬ μ‚¬μš©μžμ˜ μœ„μΉ˜λ‘œλΆ€ν„° 반경 5km μ΄λ‚΄μ˜ μŒμ‹μ  검색’ λ“±κ³Ό 같은 검색에 μ‚¬μš©ν•  수 μžˆλ‹€.

κ·Έλ¦Ό 8.24μ—μ„œ β€˜P’가 기쀀점이닀. κΈ°μ€€μ μœΌλ‘œλΆ€ν„° 반경 5km μ΄λ‚΄μ˜ μœ„μΉ˜(점)듀을 κ²€μƒ‰ν•˜λ €λ©΄ 사각 μ μ„ μ˜ μƒμžμ— ν¬ν•¨λ˜λŠ”(ST_Contains() λ˜λŠ” ST_Within() ν•¨μˆ˜ 이용) 점듀을 κ²€μƒ‰ν•˜λ©΄ λœλ‹€.

  • μ—¬κΈ°μ„œ contains(), within() 연산은 μ‚¬κ°ν˜• λ°•μŠ€μ™€ 같은 λ‹€κ°ν˜•(Polygon)으둜 μ—°μ‚°ν•  수 μžˆμœΌλ―€λ‘œ, 반경 5kmλ₯Ό κ·Έλ¦¬λŠ” 원을 ν¬ν•¨ν•˜λŠ” μ΅œμ†Œ μ‚¬κ°ν˜•(MBR)으둜 포함 관계λ₯Ό μˆ˜ν–‰ν•œλ‹€.

  • 점 β€˜P6’은 5km 이상 λ–¨μ–΄μ Έ μžˆμ§€λ§Œ μ΅œμ†Œ μ‚¬κ°ν˜• λ‚΄μ—λŠ” ν¬ν•¨λœλ‹€.

μ—¬κΈ°μ„œ 점 β€˜P6’을 μ œμ™Έν•˜κ³  κ²°κ³Όλ₯Ό μ‘°νšŒν•˜λ €λ©΄ 쑰금 λ³΅μž‘ν•œ 비ꡐ가 ν•„μš”ν•˜λ‹€. P6을 결과에 ν¬ν•¨μ‹œν‚¨λ‹€λ©΄ λ‹€μŒ 쿼리만 μˆ˜ν–‰ν•˜λŠ” 것이 μ’‹λ‹€.

contains()와 within() ν•¨μˆ˜λŠ” 거의 λ™μΌν•œ 비ꡐλ₯Ό μˆ˜ν–‰ν•˜μ§€λ§Œ 두 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λŠ” λ°˜λŒ€λ‘œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • contains()의 첫 번째 νŒŒλΌλ―Έν„°λŠ” 포함 경계λ₯Ό κ°€μ§„ λ„ν˜•μ„ λͺ…μ‹œν•˜κ³  두 번째 νŒŒλΌλ―Έν„°λŠ” ν¬ν•¨λ˜λŠ” λ„ν˜•(λ˜λŠ” 점 μ’Œν‘œ)을 λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.

  • within()은 κ·Έ λ°˜λŒ€μ΄λ‹€.

점 P6을 μ œμ™Έμ‹œν‚€λ €λ©΄ contains() 비ꡐ 결과에 ST_Distance_Sphere()ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ ν•œλ²ˆ 더 필터링해야 ν•œλ‹€.

Last updated