MySQL FullText 검색

-- MySQL 2013. 10. 17. 11:37
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
보통 쿼리로 검색을 할 때 아래와 같이 LIKE검색을 하게 된다.

SELECT * FROM test WHERE name LIKE '%search%';

그런데, LIKE 자체가 LIKE '%search%'처럼, 왼쪽에도 %를 걸면 인덱스를 타지 않아 속도가 느리다.
더욱이 테이블의 용량이 대용량으로 갈수록 더더욱 느린 결과를 나타낼 수 밖에 없다.
그래서, 여느 DBMS와 마찬가지로 MySQL도 FULLTEXT검색을 지원한다.

- MyISAM엔진에서 지원
- CHAR, VARCHAR, TEXT 타입에서 지원


1. FULLTEXT INDEX 생성

CREATE FULLTEXT INDEX idx_ft_name ON test (name);

만약 MyISAM엔진이 아니라면, FULLTEXT INDEX를 지원하지 않은 engine type이라고 에러가 난다.


2. FULLTEXT 쿼리

1) 특정 단어에 대해 검색할 때
SELECT * FROM test WHERE MATCH(name) AGAINST("tiger");

2) 두 단어가 포함하여 검색할 때
SELECT * FROM test WHERE MATCH(name) AGAINST(' + "tiger" + "lion"' IN BOOLEAN MODE);

3) 두 단어는 포함하고 특정 단어는 포함하지 않고 검색할 때
SELECT * FROM test WHERE MATCH(name) AGAINST(' + "tiger" + "lion" - "leopard"' IN BOOLEAN MODE);


추가) 2017-09-27

댓글을 다시 곰곰히 읽어보니 밑에 LIKE문을 써놔서 FULLTEXT랑 LIKE랑 완전히 같다는 착각을 일으킬 수 있다고 생각되어 해당 부분은 설명으로 대치해두었다.


LIKE %keyword% 는 인덱스를 타지 않고 대용량에서 하나씩 대입되는지 확인해야하는데, 더 느리다는 댓글이 있어 아래 링크를 참고하기 위해 걸어둔다.


http://crystalcube.co.kr/163


https://www.clien.net/service/board/park/6649702


http://www.database.sarang.net/?inc=read&aid=15466&criteria=mysql&subcrit=&id=&limit=20&keyword=%ED%8C%8C%EC%9B%8C%EB%B9%8C%EB%8D%94+%26+sqlstate&page=1

'-- MySQL' 카테고리의 다른 글

쿼리에서 Split처럼 문자열의 요소값을 얻기  (0) 2015.02.09
모든 Stored Procedure, Function의 내용 검색  (0) 2015.02.09
MySQL 대용량 Insert  (0) 2013.10.15
반올림, 버림  (0) 2013.08.20
MySQL Transaction Isolation Level  (0) 2013.08.08
posted by 어린왕자악꿍