📌 주의: 해당 글은 잘못된 내용이 포함 되어 있을 수 있습니다.
혹시 잘못된 내용을 발견 하신다면 댓글로 알려주시면 감사 합니다!
[ 🌱 배경 ]
일반적으로 검색을 사용할 때 LIKE '%검색어' 를 사용 하게 됩니다.
하지만 와일드 카드를 검색어 앞에 사용 하면 인덱스를 타지 못하는 문제가 발생 합니다.
이를 해결 하기 위해서 MySQL은 전문 검색 인덱스인 FullText Index를 지원 합니다.
[ 🌱 적용 방법 ]
MySQL 설정 파일인 My.ini 파일 [ mysql ] 영역에 밑 내용을 적용 합니다.
파일을 찾기 어렵다면 my.ini 찾는 방법을 참고 하시면 좋을 것 같습니다.
ngram_token_size=2;
ft_stopword_file=' '
n-gram 알고리즘이란 공백 기준으로 단어를 분리 하고 n 길이씩 토큰으로 만드는 알고리즘 입니다.
위 설정은 토큰의 길이를 2로 설정 한다는 의미 입니다.
ft_stopword_file은 MySQL 기본 내장 불용어를 사용 하지 않기 위해서 설정 합니다.
불용어란 'a', 'in', 'the' 와 같이 문맥에서 큰 의미를 차지 않는 단어를 의미 합니다.
불용어 설정된 단어는 인덱스로 등록 되지 않습니다.
[ 🌱 사용 예시 ]

n-gram 알고리즘은 n 길이 이상 단어만 검색 가능 합니다.

예시로 n = 2 일 때 한 글자는 검색 되지 않습니다.

단어 검색도 가능 합니다. 가능한 이유는 n-gram 알고리즘이 토큰을 만드는 원리와 관련 있습니다.
예시로 "MySQL" 단어를 토큰으로 만드는 과정 입니다.
| 단어 | 인덱스 |
| 1번째 | My |
| 2번째 | My / yS |
| 3번째 | My / yS / SQ |
| 4번째 | My / yS / SQ / QL |
단어를 검색할 때는 검색 단어를 n-gram 방식으로 나누어서 동등 검색 후 그룹화 합니다.
MySQL 검색을 예시로 들면 My / yS / SQ / QL 을 모두 동등 검색 후 row로 그룹화 하는 것 입니다.
[ 🌱 검색 모드 ]
전문 검색 쿼리는 두 가지 모드를 지원 합니다.
[ 자연어 검색 ]
- 검색 단어를 많이 가진 순서로 정렬
- 문장의 경우 각 단어를 분리 하여 일치률 계산
- 모든 단어 포함이 아닌 일부 단어 포함도 검색 가능

[ 불리언 검색 ]
- 검색어 존재 여부에 대한 연산 가능
- '+' 포함, '-' 불포함, " " 쌍 따옴표로 묶을 경우 하나의 단어로 취급
[ 포함, 불포함 ]

[ 쌍 따옴표 ]

[ 포함, 불포함 표기X ]

[ 🌱 Like 비교 ]
[ 더미 데이터 ]
제목: 제목 + 랜덤 수
내용: 내용 + 랜덤 수
데이터 수: 100만개

+ 중복 되지 않는 데이터 3개

[ 중복 없는 단어 검색 ]


전문 검색 쿼리가 훨씬 빠른 것을 볼 수 있습니다.
[ 중복 많은 단어 검색 ]


중복이 많은 경우에는 전문 검색 쿼리가 성능이 안좋았습니다.
극단적인 경우기 때문에 중복된 데이터를 줄여 테스트 해보겠습니다.
[ 🌱 Like 비교 ]
[ 더미 데이터 ]
제목: 카테고리 ( 10종 ) + 랜덤 수
내용: 스터디 방식 ( 3종 ) + 랜덤 수
데이터 수: 1만개

위 경우에는 Like, 전문 검색 둘다 0.1초로 비슷하게 나왔습니다. ( 스크린 샷이 없네요 )
[ 🌱 문제점 ]
이런 저런 테스트를 하다 보니 문제를 발견 했습니다.
데이터가 100만개일 때 테스트 시 200초가 걸린 쿼리가 있었습니다.


비슷한 경험을 검색 해보니 where 절에 다른 조건을 추가 하면 성능이 저하 된다는 내용 입니다.
또한 대용량 데이터용으론 성능이 제한적이라고 합니다.
MySQL Full-Text Search Limitations and Alternative Solutions
Find out about the limits of MySQL Full-Text Search and discover other full-text search alternative solutions. Improve your data search efficiency.
data-sleek.com
하지만 where 절에 조건을 제거 하여도 성능이 여전히 좋지 않았습니다.


다른 내용은 찾기가 어려워 데이터의 크기가 클 때는 기복이 있다 정도로만 유추 됩니다.
[ 🌱 느낀점 ]
FullText Index는 항상 최선의 선택은 아니지만 Like 검색 보다 효율적이고
다양한 검색기능을 제공한다는 점에서 장점이 있다고 생각 합니다.
[ Like ]: 완전 일치

[ 자연어 검색 ]: 일부 일치

[ 불린 검색 ]: 일치, 포함, 불포함

[ 🌱 프로젝트 적용 ]
현재 진행 중인 스터디 관리 프로젝트는 이용자가 많지 않아 FullText 검색의 성능 저하 가능성이 낮습니다.
또한 사용자가 "자바 스터디", "자바스터디" 등 다양한 형태로 검색어를 입력할 수 있으므로,
완전 일치하지 않더라도 결과를 반환하는 것이 더 나은 사용자 경험을 제공 한다고 판단하여
자연어 검색을 적용하기로 하였습니다.

'DB' 카테고리의 다른 글
| [ DB ] 인덱스를 통한 성능 개선 (3) | 2025.08.13 |
|---|