B-Tree와 R-Tree

B-Tree 인덱스의 가용성

책너두 6기 24일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.247 ~ p.257

내용정리

08 인덱스

8.3.7 B-Tree 인덱스의 가용성과 효율성

쿼리의 where 조건이나 group by, 또는 order by 절이 어떤 경우에 인덱슬르 사용할 수 있고 어떤 방식으로 사용할 수 있는지 식별할 수 있어야 한다.

8.3.7.1 비교 조건의 종류와 효율성

다중 칼럼 인덱스에서 각 칼럼의 순서와 그 칼럼에 사용된 조건이 동등 비교(“=”)인지 아니면 크다(“>”) 또는 작다(“<”) 같은 범위 조건인지에 따라 각 인덱스의 칼럼의 활용 형태가 달라지며, 그 효율 또한 달라진다.

필터링 : 인덱스를 통해 읽은 레코드가 나머지 조건에 맞는지 비교하면서 취사선택하는 작업

작업 범위 결정 조건 : 작업의 범위를 결정하는 조건. 많으면 많을수록 쿼리의 처리 성능을 높인다.

필터링 조건(체크 조건) : 비교 작업의 범위를 줄이지 못하고 단순히 거름종이 역할만 하는 조건. 많으면 오히려 쿼리 실행을 느리게 만들 때가 많다.

8.3.7.2 인덱스의 가용성

B-Tree 인덱스는 왼쪽 값에 기준해서(Left-most) 오른쪽 값이 정렬돼 있다. 왼쪽이란 하나의 칼럼 내에서뿐만 아니라 다중 칼럼 인덱스의 칼럼에 대해서도 함께 적용된다.

하나의 칼럼으로 검색해도 값의 왼쪽 부분이 없으면 인덱스 레인지 스캔 방식의 검색이 불가능하다.

다중 칼럼 인덱스에서도 마찬가지다.

8.3.7.3 가용성과 효율성 판단

다음 조건에서는 작업 범위 결정 조건으로 사용할 수 없고 경우에 따라서는 체크 조건으로 인덱스를 사용할 수는 있다.

  • NOT-EQUAL로 비교된 경우(“<>”, “NOT IN”, “NOT BETWEEN”, “IS NOT NULL”)
    • .. WHERE column <> ‘N’
    • .. WHERE column NOT IN (10,11,12)
    • .. WHERE column IS NOT NULL
  • LIKE ‘%??’(앞부분이 아닌 뒷부분 일치) 형태로 문자열 패턴이 비교된 경우
    • .. WHERE column LIKE ‘%승환’
    • .. WHERE column LIKE ‘_승환’
    • .. WHERE column LIKE ‘%승%’
  • 스토어드 함수나 다른 연산자로 인덱스 칼럼이 변형된 후 비교된 경우
    • .. WHERE SUBSTRING(column,1,1) = ‘X’
    • .. WHERE DAYOFMONTH(column) = 1
  • NOT-DETERMINISTIC 속성의 스토어드 함수가 비교 조건에 사용된 경우
    • .. WHERE column = deterministic_function()
  • 데이터 타입이 서로 다른 비교(인덱스 칼럼의 타입을 변환해야 비교가 가능한 경우)
    • .. WHERE column = 10
  • 문자열 데이터 타입의 콜레이션이 다른 경우
    • .. WHERE cutf8_bin_chyar_column = euckr_bin_char_column

다른 일반적인 DBMS에서는 NULL 값이 인덱스에 저장되지 않지만 MySQL에서는 저장된다.

다중 칼럼으로 만들어진 인덱스는 아래와 같다.

  • 작업 범위 결정 조건으로 인덱스를 사용하지 못하는 경우
    • column_1 칼럼에 대한 조건이 없는 경우
    • column_1 칼럼의 비교 조건이 위의 인덱스 사용 불가 조건 중 하나인 경우
  • 작업 범위 결정 조건으로 인덱스를 사용하는 경우(i는 2보다 크고 n보다 작은 임의의 값을 의미)
    • column1 ~ column(i-1) 칼럼까지 동등 비교 형태(“=” 또는 “IN”)로 비교
    • column_i 칼럼에 대해 다음 연산자 중 하나로 비교
      • 동등 비교(“=” 또는 “IN”)
      • 크다 작다 형태(“>” 또는 “<”)
      • LIKE로 좌측 일치 패턴(LIKE ‘승환%’)

위의 두 가지 조건을 모두 만족하는 쿼리는 coulmn1부터 coulumn_i까지는 작업 범위 결정 조건으로 사용되고, column(i+1)부터 column_n까지의 조건은 체크 조건으로 사용된다.

8.4 R-Tree 인덱스

  • 공간 인덱스(Spatial Index) : R-Tree 인덱스 알고리즘을 이용해 2차원의 데이터를 인덱싱하고 검색하는 목적의 인덱스다.

  • B-Tree는 인덱스를 구성하는 칼럼의 값이 1차원의 스칼라 값인 반면, R-Tree 인덱스는 2차원의 공간 개념 값
  • MySQL의 공간 확장(Spatial Extension)의 기능
    • 공간 데이터를 저장할 수 있는 데이터 타입
    • 공간 데이터의 검색을 위한 공간 인덱스(R-Tree 알고리즘)
    • 공간 데이터의 연산 함수(거리 또는 포함 관계의 처리)

8.4.1 구조 및 특성

  • MySQL은 공간 정보의 저장 및 검색을 위해 여러 가지 기하학적 도형(Geometry) 정보를 관리할 수 있는 데이터 타입을 제공한다.
  • GEOMETRY 데이터 타입은 POINT, LINE, POLYGON 라는 3개 타입의 슈퍼 타입으로 세 가지 객체를 모두 저장할 수 있다.
  • MBR : Minimum Bounding Rectangle의 약자로 해당 도형을 감싸는 최소 크기의 사각형을 의미한다.
  • 이 사각형들의 포함 관계를 B-Tree 형태로 구현한 인덱스가 R-Tree 인덱스다.

여러 도형들이 존재하는 공간 데이터가 있다면 이 도형들의 MBR을 3개의 레벨로 나눌 수 있다.

  • 최상위 레벨 : R-Tree의 루트 노드에 저장되는 정보
  • 차상위 레벨 : 중간 크기의 MBR(도형 객체의 그룹). R-Tree의 브랜치 노드가 된다.
  • 최하위 레벨 : 각 도형 데이터의 MBR을 의미

각 도형의 객체는 리프 노드에 저장된다.

8.4.2 R-Tree 인덱스의 용도

  • GPS 기준의 위도, 경도 좌표 저장에 주로 사용
  • CAD/CAM 소프트웨어 또는 회로 디자인 등과 같이 좌표 시스템에 기반을 둔 정보에 대해서는 모두 적용 가능
  • R-Tree는 각 도형(정확히는 도형의 MBR)의 포함 관계를 이용해 만들어진 인덱스다.
  • 따라서 포함 관계를 비교하는 함수로 검색을 수행하는 경우에만 인덱스를 이용할 수 있다.
  • 예시 : 현재 사용자의 위치로부터 반경 5km 이내의 음식점 검색 등