카테고리 없음

[Real MySQL 8.0] 8. 인덱스 (4) 8.5~

pwhee 2023. 2. 1. 00:29

8.5 전문 검색 인덱스

문서 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색할 때는 일반적인 B-Tree사용 불가능

-> 구조적으로 동치, 범위 비교만 가능하다.

문서 전체의 검색에 대한 인덱스 알고리즘을 전문 검색(Full Text search) 인덱스라고 한다.

 

8.5.1 인덱스 알고리즘

인덱싱 기법에 따라 크게 어근 분석/n-gram 분석으로 나뉜다.

- 어근 분석 알고리즘

document의 preprocessing으로 stop word 제거, stemming을 거쳐서 인덱싱 작업이 수행된다.

stop word: 분석에 필요없는 단어(eg. ~이다, ~는 등 의미가 없는 형태소나 단어)

stemming: 어근 분석이라 나오는데 형태소 분석. mecab을 플러그인 형태로 사용 가능. 일본어만 되는 줄 알았는데 한국어도 된다니 놀랍다.

mecab이 잘 동작하려면 단어 사전을 잘 만들어야 한다. (단어 사전에 각 형태소의 품사를 저장하고 mecab은 단어 사전 정보에 맞게 문장을 분해함. mecab자체의 성능을 끌어올리는데 노력을 해야한다.)

 

8.5.1.2 n-gram 알고리즘

문서를 n글자씩 잘라서 인덱싱하는 방식.

마침표, 띄어쓰기로 일단 단어로 나누고, 나눈 단어를 n글자씩 토큰화해서 저장. 이때 연속된 토큰은 한글자씩 중복된다.

생성된 토큰에 대해 stop word를 필터링하고 저장

*stop word는 information_schema.innodb_ft_default_stopword 테이블에서 확인 가능

 

8.5.1.3 불용어 변경 및 삭제

stop word 처리를 하지 않거나 사용자가 직접 등록한 stop word를 사용하는 방법이 권장된다.

ft_stopword_file로 txt파일 지정하면 되는 듯?

필요해지면 참고

 

8.5.2 전문 검색 인덱스의 가용성

full text search index를 사용하려면 반드시 아래 두 조건을 만족해야한다.

- MATCH ... AGAINST 쿼리문 사용

- 테이블이 전문 검색 대상 컬럼에 대해 전문 검색 인덱스가 걸려있어야한다.

 

8.6 함수 기반 인덱스

컬럼 값을 변형해서 만든 결과에 대해 인덱스를 걸어야 할 때가 있다.

8.0 부터 이를 위한 함수 기반 인덱스가 지원되는데, 인덱스 구현 방법은 아래 두 가지이다.

1. 가상 컬럼

테이블에 새로운 컬럼을 추가하는 것과 같은 효과를 냄. 실제 테이블 구조가 변경된다는 단점이 있다.

 

2. 함수 이용

함수를 직접사용해서 인덱스 걸 수 있다.

INDEX ix_fullname ((CONCAT(first_name, ' ', last_name)))

 

실제로 가상 컬럼 이용하는 방법과 함수 이용하는 방법의 내부 구현은 동일하다. 즉, 둘의 성능 차이는 없다.