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
인덱스에서 삭제 된 행을 기록합니다.InnoDB
FULLTEXT
인덱스에 대한 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
테이블을 제외하고이 변수가 설정되어 있지 않으면InnoDB
FULLTEXT
INFORMATION_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)