MySQL에서 대량의 텍스트 데이터를 검색할 때 FULLTEXT 검색을 사용하면 일반적인 LIKE 연산자보다 훨씬 빠른 속도로 문자열을 찾을 수 있습니다. 이 글에서는 FULLTEXT 인덱스를 생성하고 활용하는 전체 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 검색 대상이 될 텍스트 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable1554
-> (
-> Title text
-> );
Query OK, 0 rows affected (0.63 sec)
2. FULLTEXT 인덱스 생성
다음으로 검색 속도를 높이기 위해 Title 컬럼에 FULLTEXT 인덱스를 생성합니다.
mysql> create fulltext index faster_title on DemoTable1554(Title);
Query OK, 0 rows affected, 1 warning (7.09 sec)
Records: 0 Duplicates: 0 Warnings: 1
3. 샘플 데이터 삽입
INSERT 명령어를 사용해 테스트용 레코드를 몇 개 추가합니다.
mysql> insert into DemoTable1554 values('John is working on MySQL database');
Query OK, 1 row affected (0.26 sec)
mysql> insert into DemoTable1554 values('Adam Smith is working on Java language');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1554 values('John smith is working on Python Language');
Query OK, 1 row affected (0.17 sec)4. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1554;
실행 결과는 다음과 같습니다.
+------------------------------------------+
| Title |
+------------------------------------------+
| John is working on MySQL database |
| Adam Smith is working on Java language |
| John smith is working on Python Language |
+------------------------------------------+
3 rows in set (0.00 sec)
5. MATCH...AGAINST로 빠른 문자열 검색
FULLTEXT 인덱스가 준비되었으므로, MATCH() ... AGAINST() 구문과 불리언 모드(Boolean Mode)를 조합하여 원하는 문자열을 신속하게 검색할 수 있습니다. 여기서는 "language"라는 단어를 검색해 보겠습니다.
mysql> select * from DemoTable1554 where match(Title) against('language' in boolean mode);검색 결과는 다음과 같습니다.
+------------------------------------------+
| Title |
+------------------------------------------+
| Adam Smith is working on Java language |
| John smith is working on Python Language |
+------------------------------------------+
2 rows in set (0.00 sec)
정리
FULLTEXT 인덱스와 MATCH...AGAINST 구문을 사용하면 MySQL에서 텍스트 검색 성능을 크게 향상시킬 수 있습니다. 특히 게시판, 블로그처럼 텍스트 검색이 잦은 서비스에서는 LIKE '%문자열%' 방식보다 FULLTEXT 검색이 훨씬 효율적입니다. 참고로 한글 검색 시에는 ngram 파서를 함께 설정하면 더 정확한 결과를 얻을 수 있습니다.