以下表格提供了 FULLTEXT
索引的元数据
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 |
+-------------------------------------------+
表概述
INNODB_FT_CONFIG
: 提供有关InnoDB
表的FULLTEXT
索引和相关处理的元数据。INNODB_FT_BEING_DELETED
: 提供INNODB_FT_DELETED
表的快照;它仅在OPTIMIZE TABLE
维护操作期间使用。运行OPTIMIZE TABLE
时,INNODB_FT_BEING_DELETED
表将被清空,并且DOC_ID
值将从INNODB_FT_DELETED
表中删除。由于INNODB_FT_BEING_DELETED
的内容通常寿命很短,因此该表在监控或调试方面的实用性有限。有关在具有FULLTEXT
索引的表上运行OPTIMIZE TABLE
的信息,请参见 第 14.9.6 节,“微调 MySQL 全文搜索”。INNODB_FT_DELETED
: 存储从InnoDB
表的FULLTEXT
索引中删除的行。为了避免在InnoDB
FULLTEXT
索引的 DML 操作期间进行昂贵的索引重组,有关新删除词的信息将单独存储,在进行文本搜索时从搜索结果中过滤掉,并且仅在您发出InnoDB
表的OPTIMIZE TABLE
语句时才从主搜索索引中删除。INNODB_FT_DEFAULT_STOPWORD
: 包含在InnoDB
表上创建FULLTEXT
索引时默认使用的 停用词 列表。有关
INNODB_FT_DEFAULT_STOPWORD
表的信息,请参见 第 14.9.4 节,“全文停用词”。INNODB_FT_INDEX_TABLE
: 提供有关用于处理针对InnoDB
表的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
索引的表的名称(包括数据库名称)(例如,test/articles
)。
示例 17.5 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; mysql> 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 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
FULLTEXT
INFORMATION_SCHEMA
表将为空,INNODB_FT_DEFAULT_STOPWORD
表除外。mysql> SET GLOBAL innodb_ft_aux_table = 'test/articles';
查询
INNODB_FT_INDEX_CACHE
表,该表显示有关FULLTEXT
索引中新插入行的信息。为了避免在 DML 操作期间进行昂贵的索引重组,新插入行的相关数据将保留在FULLTEXT
索引缓存中,直到运行OPTIMIZE TABLE
(或者直到服务器关闭或缓存限制超出)。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 | +------------+--------------+-------------+-----------+--------+----------+
启用
innodb_optimize_fulltext_only
系统变量,并对包含FULLTEXT
索引的表运行OPTIMIZE TABLE
。此操作会将FULLTEXT
索引缓存的内容刷新到主FULLTEXT
索引中。innodb_optimize_fulltext_only
会更改OPTIMIZE TABLE
语句对InnoDB
表的操作方式,它旨在在维护操作期间暂时启用,以用于包含FULLTEXT
索引的InnoDB
表。mysql> SET GLOBAL innodb_optimize_fulltext_only=ON; mysql> OPTIMIZE TABLE articles; +---------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+----------+ | test.articles | optimize | status | OK | +---------------+----------+----------+----------+
查询
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 | +------------+--------------+-------------+-----------+--------+----------+
由于
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;
查询
INNODB_FT_DELETED
表。该表记录从FULLTEXT
索引中删除的行。为了避免在 DML 操作期间进行昂贵的索引重组,有关新删除记录的信息将单独存储,在进行文本搜索时将被过滤掉,并在运行OPTIMIZE TABLE
时从主搜索索引中删除。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED; +--------+ | DOC_ID | +--------+ | 2 | | 3 | | 4 | +--------+
运行
OPTIMIZE TABLE
以删除已删除的记录。mysql> OPTIMIZE TABLE articles; +---------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+----------+ | test.articles | optimize | status | OK | +---------------+----------+----------+----------+
现在
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
名称。如果不存在用户定义的停用词表,则VALUE
列为空。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 | +---------------------------+-------+
禁用
innodb_optimize_fulltext_only
,因为它旨在仅在临时情况下启用mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;