MySQL에서 Like 대신 전문 검색(Full Text Search)로 속도 향상~

|



일반적으로 DB에서 특정 단어가 포함된 레코드를 찾기 위해서 LIKE 를 주로 사용한다. 

그러나 LIKE는 '%단어%'와 같이 사용할 때, 인덱스를 사용하지 않기 때문에 속도가 느려진다. 

또한 LIKE를 여러 필드 (예를 들어, title과 keyword 등)에 동시에 적용하면서 여러 단어를 검색어로 전달하면 쿼리가 복잡해지기도 한다. 


> select * from board 

> where (title like '%학교%' or body like '%학교%') 

> and (title like '%취업%' or body like '%취업%');


이를 대체하기 위해서 정규표현식을 적용할 수도 있다. 

그러나 정규표현식도 마찬가지로 인덱스를 거치지 않고 풀 스캔(Full Scan)이 일어나기 때문에 느리다. 


> select * from board 

> where (title REGEXP '학교' or body REGEXP '학교') 

> and (title REGEXP '취업' or body REGEXP '취업');


Match ~ Against 를 활용한 전문 검색 (Full-Text Search)

이런 경우, 활용할 수 있는 것이 바로 MySQL의 전문 검색(Full-Text Search)이다. 

위 예제는 다음과 같이 간단하게 쿼리할 수 있다. 


> select * from board 

> where match(title,body) against('+학교* +취업*' in boolean mode);


title과 body에 학교와 취업이 모두 포함된 레코드를 리턴해 주는 것이다. 

+는 AND를 나타내고 -는 OR를 나타내므로, 더 많은 결과를 원할 경우, '+학교* - 취업*'  형태로 사용할 수도 있다. 


MySQL의 Full-Text Search는 자연어 처리 모드도 제공하고 있다. 

그래서 다음과 같은 쿼리도 가능하다. 


> select * from board 

> where match(title,body) against('대학생 취업 문제는 무엇일까요?')




Match ~ Against 활용을 위한 설정

Full-Text Search를 위해서 테이블 생성시나 alter table로 전문 검색할 필드를 지정해 줘야 한다. 


crate table board (

 id int not null primary key,

 title varchar(200),

 body text,

 fulltext (title,body));


그리고 full-text search는 mysql 버전 5.5 이하는 MyISAM에서만 사용할 수 있다. 

5.6 이상 버전은 InnoDB에서도 사용할 수 있다. 


마지막으로 match against를 사용할 때, 처음에는 위와 같은 2글자 검색에 대한 결과는 나오지 않는다. 

기본적으로 full-text search가 4글자 이상에서만 검색되도록 설정되어 있기 때문이다. 

한글에서는 두글자 검색도 자주 일어나므로 위 설정을 2로 변경해야 보다 의미가 있다. 

다음 명령어로 확인해 보자. 


> show variables like 'ft_min_word_len';


이 값을 수정하기 위해서는 my.ini(윈도우), my.cnf(리눅스) 파일을 수정해야 한다. 

[mysqld]

ft_min_word_len = 2


설정 파일을 수정한 후, mysql 서버를 재시작하고 ft_min_word_len 값을 확인하면 2로 수정되었을 것이다. 


이상으로 mysql의 전문 검색 기능을 살펴봤다. 

속도 측면에서는 분명히 장점이 있는 듯하다. 

그리고 자연어 처리가 되는 것으로 봐서 내부적으로 형태소 분석이 포함되어 있는 것 같다.  

다만 검색 품질이 얼마나 괜찮은지는 좀 더 테스트를 해봐야 할 것으로 보인다. 





Trackback 0 And Comment 2