VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
LIKE '%keyword%'는 작은 테이블에서는 동작하지만 인덱스를 사용할 수 없습니다 — 모든 행이 스캔됩니다. 전문 검색은 텍스트 열을 검색하기 위한 인덱스 기반의 순위화된 대안을 제공합니다.
FULLTEXT 인덱스 만들기
FULLTEXT 인덱스는 InnoDB(기본 스토리지 엔진)와 MyISAM 테이블의 CHAR, VARCHAR, TEXT 열에서 동작합니다.
FULLTEXT 인덱스를 추가합니다:
FULLTEXT 인덱스가 여러 열에 걸칠 수 있습니다. 그 인덱스에 대한 쿼리는 인덱싱된 모든 열을 동시에 검색합니다.
MATCH…AGAINST로 쿼리하기
전문 쿼리는MATCH(columns) AGAINST(expression) 구문을 사용합니다. MATCH 열 목록은 FULLTEXT 인덱스의 열과 정확히 일치해야 합니다.
MATCH...AGAINST가 WHERE 절에 나타나면 MySQL은 관련성 내림차순으로 행을 반환합니다. AGAINST 표현식은 관련성 점수를 반환합니다 — 0은 일치하지 않음을 뜻합니다.
검색 모드
MySQL은 세 가지 검색 모드를 지원합니다:자연어 모드
기본값입니다. MySQL은 극히 흔한 단어를 사실상 무시하는 가중치 체계를 사용합니다 — 거의 모든 행에 나타나는 용어는 관련성 점수에 거의 기여하지 않습니다. 흔한 영어 불용어(the, is, at)는 바로 걸러집니다. 명시적인 ORDER BY가 없으면 결과는 관련성 내림차순으로 반환됩니다.
불리언 모드
불리언 모드는 정밀한 제어를 위한 연산자를 지원합니다:
InnoDB 테이블은
MATCH() 표현식의 모든 열에 FULLTEXT 인덱스가 있어야 합니다 — 없으면 InnoDB의 불리언 모드 쿼리는 오류를 반환합니다. (MyISAM은 FULLTEXT 인덱스 없이도 불리언 모드를 허용하지만 모든 행을 스캔합니다.)
쿼리 확장
2단계 검색입니다. MySQL은 초기 쿼리를 실행하고, 상위 일치 항목을 가져와 거기서 추가 용어를 추출한 다음, 그 용어를 추가하여 검색을 다시 실행합니다.전문 검색 대 LIKE
작은 테이블에서의 단순한 패턴 일치, 접두사 검색(인덱스가 있는
LIKE 'prefix%'), 또는 임의의 패턴 일치가 필요할 때는 LIKE를 사용하세요. 텍스트 열에서 단어나 구문을 검색하고 관련성 순위화나 대규모에서의 더 나은 성능이 필요할 때는 전문 검색을 사용하세요.
최소 단어 길이
InnoDB의 기본 최소 토큰 크기는 3자입니다(innodb_ft_min_token_size). 3자보다 짧은 단어는 인덱싱되지 않습니다. 2자 단어를 위해서는 최솟값을 낮추세요:
innodb_ft_min_token_size는 동적 변수가 아닙니다 — 적용하려면 서버 재시작이 필요합니다. 재시작 후 모든 FULLTEXT 인덱스를 다시 빌드하세요:
자주 묻는 질문
단어가 테이블에 있는데도 MATCH…AGAINST가 행을 반환하지 않는 이유는 무엇인가요?
흔한 이유 세 가지: (1) 단어가innodb_ft_min_token_size(기본값 3)보다 짧습니다. (2) 단어가 불용어 목록에 있습니다. (3) MyISAM 테이블에서 단어가 행의 50% 이상에 나타납니다 — MyISAM의 자연어 모드는 그런 단어를 너무 흔해서 쓸모없는 것으로 취급합니다. InnoDB에는 이런 제한이 없습니다. MyISAM의 50% 임계값을 우회하려면 불리언 모드를 사용하세요.
전문 검색을 WHERE 조건과 함께 사용할 수 있나요?
예.MATCH...AGAINST를 다른 WHERE 조건과 평소처럼 결합하세요:
FULLTEXT 인덱스를 사용하고 다른 인덱싱된 열에 대해서는 별도로 필터링할 수 있습니다.
MySQL 전문 검색은 여러 언어를 지원하나요?
MySQL에는 여러 언어의 내장 불용어 목록이 있습니다. 프로덕션의 다국어 검색에는 보통innodb_ft_enable_stopword = OFF를 구성하고 innodb_ft_server_stopword_table로 자체 불용어 테이블을 제공하거나, 외부 검색 엔진(Elasticsearch, MeiliSearch)을 사용해야 합니다.
문제 해결
함께 보기
- MySQL 인덱스의 동작 방식 — FULLTEXT는 B-트리와 나란한 특수 인덱스 유형입니다
- MySQL의 JSON — 구조화된 데이터와 함께 JSON 텍스트 필드 검색하기
- 다차원 범위 쿼리 — 텍스트 검색이 맞지 않을 때 여러 숫자 차원에 걸친 검색
- MySQL LIKE — 전문 인덱스가 대규모에서 대체하는 패턴 연산자
- MySQL REGEXP — 모든 행을 읽는 패턴 일치