MySQL 5.6 부터 InnoDB 에서도 전문 검색 엔진 기능 추가.
MySQL 5.5 에서는 MyISAM 의 한계로 전문 검색 엔진 효용 가치 낮음.
create table employee_name_innodb (
emp_no int(11) not null,
first_name varchar(14) not null,
last_name varchar(16) not null,
primary key (emp_no)
) engine=innodb default charset=utf8;
insert into employee_name_innodb
select emp_no, first_name, last_name from employees;
alter table employee_name_innodb
add fulltext index fx_firstname_lastname (first_name, last_name);
show warnings;
ibd 파일 | 역할 | 비고 |
---|---|---|
employee_name_innodb.ibd | 테이블 데이터 저장용 기본 테이블 스페이스 | |
FTS_xxx_yyy_DOC_ID.ibd | 단위 검색어로 구성 된 인덱스 테이블 스페이스 | 컬럼의 값을 구분자로 자른 결과, 인덱스 별 존재 |
FTS_xxx_CONFIG.ibd | 전문 검색 인덱스 설정 저장 | optimize_checkpoint_limit, synced_doc_id, deleted_doc_count, stopword_table_name, use_stopword 등 |
FTS_xxx_STOPWORDS.ibd | 전문 검색 인덱스가 사용하는 구분자 저장 | 기본 내장, 사용자 지정 |
FTS_xxx_{ADDED,DELETED}.ibd | 추가/삭제 레코드 FTS_DOC_ID 저장, 검색시 DELETED 레코드 제거 후 사용자에게 반환 | 레코드 추가 삭제 즉시 전문 검색 인덱스 반영 안됨 |
FTS_xxx_BEING_{ADDED,DELETED}.ibd | 전문 검색 인덱스에 반영(임시→메인)시 작업중 FTS_DOC_ID 값 저장 | 이 파일은 대부분 비어 있음 |
FTS_xxx_{ADDED,DELETED}_CACHE.ibd | 레코드 추가 삭제 내용을 즉시 반영하는 임시 전문 인덱스, 메인 전문 인덱스 반영은 테이블 리빌드에 의해 처리 |
-- 전문 검색 인덱스 반영을 위한 테이블 리빌드
ALTER TABLE employee_name_innodb ENGINE = InnoDB;
OPTIMIZE TABLE employee_name_innodb;
테이블 | 단위 | 내용 |
---|---|---|
INNODB_FT_CONFIG | 전체 | 전문 검색 인덱스의 기본 설정 |
INNODB_FT_DEFAULT_STOPWORD | 전체 | InnoDB의 기본 구분자 목록, 영어에 적합한 구분자 존재 |
INNODB_FT_INDEX_TABLE | 테이블 | innodb_ft_aux_table 변수값 저장 |
INNODB_FT_INDEX_CACHE | 테이블 | 임시 전문 인덱스 내용 저장 |
INNODB_FT_{INSERTED,DELETED} | 테이블 | 추가/삭제된 레코드의 FTS_DOC_ID 저장 |
INNODB_FT_BEING{INSERTED,DELETED} | 테이블 | 테이블 리빌드에 의해 메인 전문 인덱스에 반영 중인 레코드 정보 저장 |
SET GLOBAL innodb_ft_aux_table = 'employees/employee_name_innodb';
SELECT * FROM employee_name_innodb WHERE MATCH(first_name, last_name) AGAINST ('+Matt +Wallrath' IN BOOLEAN MODE);
EXPLAIN
SELECT * FROM employee_name_innodb WHERE MATCH(first_name) AGAINST ('+Matt +Wallrath' IN BOOLEAN MODE);
-- ALL
EXPLAIN
SELECT * FROM employee_name_innodb WHERE MATCH(first_name, last_name) AGAINST ('+Matt +Wallrath' IN BOOLEAN MODE);
-- FULLTEXT
CREATE TABLE stopword_for_employees (
value varchar(18) NOT NULL DEFAULT ''
) ENGINE = InnoDB;
INSERT INTO stopword_for_employees SELECT * FROM INFORMATION_SCHEMA.innodb_ft_default_stopword;
SELECT * FROM stopword_for_employees limit 10;
SET GLOBAL innodb_ft_server_stopword_table = 'employees/stopword_for_employees';
-- ERROR 1231 / Latin1 문자 셋만 사용 가능
ALTER TABLE stopword_for_employees CONVERT TO CHARACTER SET Latin1;
SET GLOBAL innodb_ft_server_stopword_table = 'employees/stopword_for_employees';
구분 | 최소 | 최대 |
---|---|---|
MyISAM | ft_min_word_len(4) | ft_max_word_len(무제한) |
InnoDB | innodb_ft_min_token_size(3) | innodb_ft_max_token_len(64) |
- 강좌 URL : http://www.gurubee.net/lecture/4203
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.