14.14.4 InnoDB INFORMATION_SCHEMA FULLTEXT 인덱스 테이블
MySQL 5.6.4에서 InnoDB 테이블의 FULLTEXT 인덱스 지원의 도입으로 INFORMATION_SCHEMA 데이터베이스에 다음 테이블이 추가되었습니다.
mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_FT%'; +-------------------------------------------+ | Tables_in_INFORMATION_SCHEMA (INNODB_FT%) | +-------------------------------------------+ | INNODB_FT_CONFIG | | INNODB_FT_BEING_DELETED | | INNODB_FT_DELETED | | INNODB_FT_DEFAULT_STOPWORD | | INNODB_FT_INDEX_TABLE | | INNODB_FT_INDEX_CACHE | +-------------------------------------------+ 6 rows in set (0.00 sec)
테이블의 개요
INNODB_FT_CONFIG:FULLTEXT인덱스에 대한 메타 데이터와InnoDB테이블에 연관된 프로세스를 표시합니다.INNODB_FT_BEING_DELETED:OPTIMIZE TABLE유지 관리 작업 중에 만 사용되는INNODB_FT_DELETED테이블의 스냅 샷을 제공합니다.OPTIMIZE TABLE이 실행되면INNODB_FT_BEING_DELETED테이블은 비워지고INNODB_FT_DELETED테이블에서 DOC_ID이 삭제됩니다.INNODB_FT_BEING_DELETED의 내용은 일반적으로 유효 기간이 짧기 때문에 모니터링 및 디버깅이 테이블의 유용성은 제한됩니다.FULLTEXT인덱스를 가진 테이블에서OPTIMIZE TABLE의 실행의 자세한 내용은 섹션 12.9.6 "MySQL의 전체 텍스트 검색 미세 조정" 을 참조하십시오.INNODB_FT_DELETED:InnoDB테이블의FULLTEXT인덱스에서 삭제 된 행을 기록합니다.InnoDBFULLTEXT인덱스에 대한 DML 작업 중 고가의 인덱스 재구성이 발생하지 않도록하기 위해 새로 삭제 된 단어에 대한 정보는 별도로 저장되고 텍스트 검색을 수행하면 검색 결과에서 필터링되어OPTIMIZE TABLE테이블을 실행 한 경우에만 기본 검색 인덱스에서 제거됩니다.INNODB_FT_DEFAULT_STOPWORD:FULLTEXT인덱스를 만들 때 기본적으로 사용되는 중지 단어 목록을 유지합니다.INNODB_FT_DEFAULT_STOPWORD테이블 내용은 섹션 12.9.4 "전문 스톱 워드" 를 참조하십시오.INNODB_FT_INDEX_TABLE:FULLTEXT인덱스에 대한 텍스트 검색을 처리하는 데 사용되는 역 인덱스에 대한 데이터가 포함되어 있습니다.INNODB_FT_INDEX_CACHE:FULLTEXT인덱스에 새로 삽입 된 행에 대한 토큰 정보가 포함되어 있습니다. DML 작업 중 부하가 큰 인덱스 재구성을 피하기 위해 새로 인덱싱 된 단어에 대한 정보는 별도로 저장되며OPTIMIZE TABLE의 실행시 서버가 종료 될 때 또는 캐시 크기가innodb_ft_cache_size과innodb_ft_total_cache_size에서 정의 된 제한을 초과하는 경우에만 기본 검색 인덱스와 결합됩니다.
INNODB_FT_DEFAULT_STOPWORD 테이블을 제외하고 innodb_ft_aux_table 구성 변수를 FULLTEXT 인덱스를 포함하는 테이블의 이름 ( database_name / table_name )로 설정해야합니다. 그렇지 않으면, InnoDB FULLTEXT 인덱스 INFORMATION_SCHEMA 테이블이 비어 표시됩니다.
예 14.16 InnoDB FULLTEXT 인덱스 INFORMATION_SCHEMA 테이블
이 예에서는 FULLTEXT 인덱스가있는 테이블을 사용하여 FULLTEXT 인덱스 INFORMATION_SCHEMA 테이블에 포함 된 데이터를 보여줍니다.
FULLTEXT인덱스가있는 테이블을 만들고 일부 데이터를 삽입합니다.mysql> CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR (200) body TEXT, FULLTEXT (title, body) ) ENGINE = InnoDB; INSERT INTO articles (title, body) VALUES ( 'MySQL Tutorial', 'DBMS stands for DataBase ...') ( 'How To Use MySQL Well', 'After you went through a ...') ( 'Optimizing MySQL', 'In this tutorial we will show ...') ( '1001 MySQL Tricks', '1. Never run mysqld as root 2. ...') ( 'MySQL vs. YourSQL', 'In the following database comparison ...') ( 'MySQL Security', 'When configured properly, MySQL ...');
innodb_ft_aux_table변수를FULLTEXT인덱스를 포함하는 테이블의 이름으로 설정합니다.INNODB_FT_DEFAULT_STOPWORD테이블을 제외하고이 변수가 설정되어 있지 않으면InnoDBFULLTEXTINFORMATION_SCHEMA테이블이 비어 표시됩니다.SET GLOBAL innodb_ft_aux_table = 'test / articles';INNODB_FT_INDEX_CACHE테이블을 쿼리합니다. 그러면FULLTEXT인덱스에 새로 삽입 된 행에 대한 정보가 표시됩니다. DML 작업 중 고가의 인덱스 재구성이 발생하지 않도록하기 위해 새로 삽입 된 행의 데이터는OPTIMIZE TABLE이 수행 될 때까지 (또는 서버가 종료되거나 캐시 제한 이상의까지)FULLTEXT인덱스 캐시에 남아 있습니다.mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5; +------------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +------------+--------------+-------------+-----------+--------+----------+ | 1001 | 5 | 5 | 1 | 5 | 0 | | after | 3 | 3 | 1 | 3 | 22 | | comparison | 6 | 6 | 1 | 6 | 44 | | configured | 7 | 7 | 1 | 7 | 20 | | database | 2 | 6 | 2 | 2 | 31 | +------------+--------------+-------------+-----------+--------+----------+ 5 rows in set (0.00 sec)
innodb_optimize_fulltext_only을 활성화하고FULLTEXT인덱스가있는 테이블에OPTIMIZE TABLE을 실행합니다. 그러면FULLTEXT인덱스 캐시의 내용이 주FULLTEXT인덱스에 플래시됩니다.innodb_optimize_fulltext_only은InnoDB테이블에서OPTIMIZE TABLE문 동작 방법을 변경하는 것이며,FULLTEXT인덱스를 포함InnoDB테이블에서의 유지 보수 작업 중에 일시적으로 사용하는 것을 목적으로하고 있습니다.mysql> SET GLOBAL innodb_optimize_fulltext_only=ON; Query OK, 0 rows affected (0.00 sec) mysql> OPTIMIZE TABLE articles; +---------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+----------+ | test.articles | optimize | status | OK | +---------------+----------+----------+----------+ 1 row in set (0.03 sec)
INNODB_FT_INDEX_TABLE테이블에 쿼리하여 주FULLTEXT인덱스의 데이터에 대한 정보 (FULLTEXT인덱스 캐시에서 플러시 된 직후의 데이터에 대한 정보를 포함)를 표시합니다.mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE LIMIT 5; +------------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +------------+--------------+-------------+-----------+--------+----------+ | 1001 | 5 | 5 | 1 | 5 | 0 | | after | 3 | 3 | 1 | 3 | 22 | | comparison | 6 | 6 | 1 | 6 | 44 | | configured | 7 | 7 | 1 | 7 | 20 | | database | 2 | 6 | 2 | 2 | 31 | +------------+--------------+-------------+-----------+--------+----------+ 5 rows in set (0.00 sec)
OPTIMIZE TABLE조작에 의해FULLTEXT인덱스 캐시가 플러시 된 때문에INNODB_FT_INDEX_CACHE테이블이 비어 있습니다.mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5; Empty set (0.00 sec)
test/articles테이블에서 일부 레코드를 삭제합니다.mysql> DELETE FROM test.articles WHERE id <4; Query OK, 3 rows affected (0.11 sec)
INNODB_FT_DELETED테이블을 쿼리합니다. 이 테이블은FULLTEXT인덱스에서 삭제 된 행이 기록됩니다. DML 작업 중 고가의 인덱스 재구성이 발생하지 않도록하기 위해 새로 삭제 된 레코드에 대한 정보는 별도로 저장되고 텍스트 검색을 수행하면 검색 결과에서 필터링되어OPTIMIZE TABLE을 실행 그러자 기본 검색 인덱스에서 제거됩니다.mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED; +--------+ | DOC_ID | +--------+ | 2 | | 3 | | 4 | +--------+ 3 rows in set (0.00 sec)
OPTIMIZE TABLE을 실행하여 삭제 된 레코드를 삭제합니다.mysql> OPTIMIZE TABLE articles; +---------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+----------+ | test.articles | optimize | status | OK | +---------------+----------+----------+----------+ 1 row in set (0.10 sec)
INNODB_FT_DELETED테이블이 비어 표시되게됩니다.mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED; Empty set (0.00 sec)
INNODB_FT_CONFIG테이블을 쿼리합니다. 이 테이블은FULLTEXT인덱스에 대한 메타 데이터와 연관된 처리가 포함되어 있습니다.optimize_checkpoint_limit은OPTIMIZE TABLE의 실행이 중지 될 때까지의 시간 (초)입니다.synced_doc_id는 발급 된 다음DOC_ID입니다.stopword_table_name사용자 정의 중지 단어 테이블에 대한database/table의 이름입니다. 사용자 정의 불용어 테이블이없는 경우,이 필드는 비어 있습니다.use_stopword은 중지 단어 테이블을 사용할지 여부를 나타냅니다. 이것은FULLTEXT인덱스를 만들 때 정의됩니다.
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG; +---------------------------+-------+ | KEY | VALUE | +---------------------------+-------+ | optimize_checkpoint_limit | 180 | | synced_doc_id | 8 | | stopword_table_name | | | use_stopword | 1 | +---------------------------+-------+ 4 rows in set (0.00 sec)