예전에는 단순한 데이터 저장 및 검색이 RDBMS의 주요 요건이던 시절이 있었다.
하지만 데이터의 형태는 다양해졌고, 그에 따라 응용 프로그램들도 사용자의 위치, 이동 경로, 그리고 사용자들이 작성한 문서들에 대한 다양한 형태의 검색 기능을 장착하고 있다.
MySQL 서버도 이 같은 데이터 요건 변화에 맞춰 다양한 검색 기능을 추가하고 개선해 나가고 있다.
대표적 확장 검색 기능인 전문 검색과 공간 검색 기능을 살펴보자.
MySQL 서버는 예전부터 용량이 큰 문서를 단어 수준으로 잘게 쪼개어 문서 검색을 해주는 기능이 예전부터 있었다.
이러한 검색은 전문 검색(Full-text Search) 이라고 한다.
MySQL 8.0에서는 가장 사용률이 높은 InnoDB 스토리지 엔진에서도 전문 검색을 사용할 수 있도록 개선되었다.
12.1.1 전문 검색 인덱스의 생성과 검색
MySQL 서버에서는 다음 2가지 알고리즘을 이용해 인덱싱할 토큰을 분리해난다.
- 형태소 분석(서구권 언어의 경우, 어근 분석)
- n-gram 파서
MySQL 서버에서는 단순히 공백과 같은 띄어쓰기 기준으로 토큰을 분리해서 형태소를 분석한다.
(원래 형태소 분석은 이런 단순한 방법이 아니다!)
그리고 n-gram은 문장 자체에 대한 이해 없이 공백과 같은 띄어쓰기 단위로 단어를 분리하고,
그 단어를 단순히 주어진 길이(n-gram의 n은 1~10 사이의 숫자 값)로 쪼개서 인덱싱하는 알고리즘이다.
보통 형태소 분석은 내용도 방대하고 사용하기도 쉽지 않으므로 여기서는 생략하면서,
한국어에 어울리면서 범용으로 가볍게 사용할 수 있는 n-gram 파서 알고리즘을 사용한다고 한다.
n-gram에서 n은 숫자 값을 의미하며, ngram_token_size 시스템 변수로 변경할 수 있다.
ngram_token_size의 기본 값은 2이며, 1~10 까지 조절할 수 있다.
보통 n = 1이면 uni-Gram, 2이면 bi-Gram, 3이면 tri-Gram이라고 한다.
책의 bi-gram과 tri-gram 전문 검색 인덱스 예제를 종합하면 다음과 같은 규칙을 확인할 수 있다.
- 검색어의 길이가 ngram_token_size보다 작은 경우 -> 검색 불가능
- 검색어의 길이가 ngram_token_size보다 크거나 같은 경우 -> 검색 가능
예를 들어, ngram_token_size=2인 경우,
2글자 이상의 검색어는 사용 가능하지만 1글자 검색어는 결과를 가져오지 못한다는 것이다.
그리고 더 중요한 특징은 찾고자 하는 검색어가 단어의 시작 부분이 아니고,
중간이나 마지막 부분이어도 검색할 수 있다는 것이다.
12.1.2 전문 검색 쿼리 모드
MySQL 서버의 전문 검색 쿼리는 자연어 검색 모드와 불리언 검색 모드를 지원한다.
디폴트는 자연어 검색 모드이고, 함께 사용할 수 있는 검색어 확장 기능도 지원한다.
12.1.2.1 자연어 검색
MySQL 서버의 자연어 검색은 검색어에 제시된 단어들을 많이 가지고 있는 순서대로 정렬해서 결과를 반환한다.
전문 검색 쿼리의 검색어에는 반드시 단일 단어만 사용되는 것이 아니라, 문장을 그대로 사용할 수도 있다.
따라서 문장을 검색어로 사용할 때는 문자을 토큰으로 분리하고, 일치하는 토큰의 일치율을 계산한다.
12.1.2.2 불리언 검색
불리언 검색은 쿼리에 사용되는 검색어의 존재 여부에 대해 논리적 연산이 가능하다.
예를 들어, ('+MySQL -manual' IN BOOLEAN MODE) 는
"MySQL"은 포함하지만 "manual"은 포함하지 않는 값을 검색하는 쿼리이다.
반대로 ('+MySQL +manual' IN BOOLEAN MODE) 는
"MySQL"과 "manual"이라는 단어를 모두 포함하는 값만 검색하는 쿼리인 것을 알 수 있을 것이다.
+, - 를 쓰지 않으면 불리언 검색은 자연어 검색과 거의 유사하지만,
서로 다른 방식으로 일치율을 계산 하기 때문에 일치율은 다르게 나온다!
12.1.2.3 검색어 확장
검색어 확장은 사용자가 쿼리에 사용한 검색어로 검색된 결과에서
공통으로 발견되는 단어를 모아서 다시 한번 더 검색을 수행하는 방식이다.
12.2 공간 검색
MySQL 서버는 다른 RDBMS 보다는 조금 늦었지만, 공간 데이터 관리에 대한 기능을 빠르게 보완하고 있다.
공간 데이터는 생소한 개념이므로, 기본 지식이나 용어에 대한 부분부터 차분히 살펴보자!
12.2.1 용어 설명
OGC(Open Geospatial Consortium)
OGC는 위치 기반 데이터에 대한 표준을 수립하는 단체로서,
정기적으로 위치 기반 데이터 및 처리에 대한 표준을 제정하고 개선하고 있다.
OpenGIS
OGC에서 제정한 지리 정보 시스템(GIS) 표준으로,
WKT, WKB 같은 지리 정보 데이터를 표기하는 방법과 저장하는 방법, 그리고 SRID와 같은 표준을 포함한다.
SRS, GCS, PCS
SRS - 좌표계(Coordinate System)으로 생각하면 된다. 이 SRS는 다시 GCS와 PCS로 구분된다.
GCS (지리 좌표계) - 위도/경도 같이 지구 상의 특정 위치나 공간을 표현하는 좌표계
PCS (투영 좌표계) - 미터(m) 같은 선형적인 단위로 표시하는 지구를 평면으로 투영시킨 좌표계
SRID, SRS-ID
SRID (Spatial Reference ID) - 특정 SRS(좌표계)를 지칭하는 고유 번호
SRS-ID == SRID
WKT (Well-Known Text format), WKB (Well-Known Binary format)
WKT, WKB는 말 그대로 위치 좌표의 표현 방법이다.
WKT - 사람의 눈으로 쉽게 확인할 수 있는 텍스트 포맷
WKB - 컴퓨터에 저장할 수 있는 형태의 바이너리 포맷
MBR, R-Tree
MBR (Minimun Bounding Rectangle) - 어떤 도형을 감싸는 가장 작은 사각 상자
R-Tree - 도형들의 포함 관계를 이용해서 만들어진 인덱스 (8.4절 R-Tree 인덱스 참조)
12.2.2 SRS (좌표계)
MySQL이 지원하는 SRS는 5000여 개가 넘는다!
이 SRS에 대한 정보는 information_schema 데이터베이스의 ST_SPATIAL_REFERENCE_SYSTEMS 테이블에 있다.
그 중 SRS_ID 칼럼과 DEFINITION 칼럼이 가장 중요하다!
SRS_ID - 해당 좌표계를 지칭하는 고유 번호가 저장되어 있다.
DEFINITION - 해당 좌표계가 어떤 좌표계인지에 대한 정의가 저장되어 있다.
DEFINITION 칼럼의 2개의 AXIS 필드도 첫 번째 AXIS가 X축, 두 번째 AXIS가 Y축으로 중요하다.
MySQL 서버에 공간 데이터를 저장할 때 별도로 SRID(SRS_ID)를 지정해야 한다.
디폴트는 SRID=0인 평면 좌표계이며,
SRID를 지정하면 MySQL 서버에서 제공되는 공간 함수를 이용해 필요한 값을 즉시 계산할 수 있다.
12.2.3 투영 좌표계와 평면 좌표계
평면 좌표계(SRID=0)는 투영 좌표계와 비슷한 특성을 가지므로 투영 좌표계 위주로 살펴보자.
지구 구체 전체 또는 일부를 평면으로 투영해서 표현한 좌표계를 투영 좌표계라고 한다.
대표적인 투영 좌표계 SRID=3857는 X축과 Y축의 단위를 미터(m)로 표현한다.
테이블을 생성할 때, SRID를 명시적으로 정의하지 않으면 해당 칼럼은 모든 SRID를 저장할 수 있다.
하지만, 하나의 칼럼에 저장된 데이터의 SRID가 제각각이면 MySQL 서버는 인덱스를 이용한 빠른 검색을 할 수 없게 된다!
실제 응용 프로그램에서 평면 좌표계는 그다지 사용되지 않지만,
투영 좌표계는 화면에 지도를 표현하는 경우 자주 사용된다.
12.2.4 지리 좌표계
지리 좌표계나 투영 좌표계를 사용하는 공간 데이터를 어떻게 저장하고 사용하고 주의 사항은 무엇인지 살펴보자.
12.2.4.1 지리 좌표계 데이터 관리
공간 데이터를 검색하는 가장 일반적인 형태는 특정 위치를 기준으로 반경 몇 km 이내의 데이터를 검색하는 작업일 것이다.
안타깝게도 MySQL 서버에서는 아직 인덱스를 이용한 반경 검색 기능(즉, 원으로 검색이 안된다)이 없다.
그래서 차선책으로 MBR(사각형, 또는 다각형)을 이용한 ST_Within() 함수를 이용한다.
이 MBR을 사각형이 아닌, 8각형, 16각형으로 하면 더 효율적으로 작동할 것이다.
# 주의 사항 - MySQL 서버의 지리 좌표계 기능은 8.0이 처음이기 때문에 정확성이나 성능에 문제가 있을 수 있다!
'데이터베이스 > MySQL' 카테고리의 다른 글
[Real MySQL 8.0 2권] 15장. 데이터 타입 (0) | 2023.04.22 |
---|