以下表提供了 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
:提供了FULLTEXT
索引和关联处理的元数据 дляInnoDB
表。 -
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
:存储从FULLTEXT
索引中删除的行 дляInnoDB
表。为了避免在 DML 操作期间对InnoDB
FULLTEXT
索引进行昂贵的索引重新组织,在删除单词信息被存储在单独的表中,过滤出搜索结果,并在您发出OPTIMIZE TABLE
语句时从主搜索索引中删除。 -
INNODB_FT_DEFAULT_STOPWORD
:持有用于创建FULLTEXT
索引的默认停用词列表 дляInnoDB
表。有关
INNODB_FT_DEFAULT_STOPWORD
表的信息,请参见 第 14.9.4 节,“全文停用词”。 -
INNODB_FT_INDEX_TABLE
:提供了用于处理FULLTEXT
索引的反向索引信息 дляInnoDB
表。 -
INNODB_FT_INDEX_CACHE
:提供了 FULLTEXT 索引中新插入行的 Token 信息。为了避免在 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 表的操作方式,旨在临时启用,以便在 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 | +------------+--------------+-------------+-----------+--------+----------+
现在
INNODB_FT_INDEX_CACHE
表为空,因为OPTIMIZE TABLE
操作已经将 FULLTEXT 索引缓存刷新到了主 FULLTEXT 索引中。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
:用户定义的停用词表的数据库/表
名称。如果没有用户定义的停用词表,则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;