下表提供了
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
通常寿命较短,因此该表用于监视或调试的实用性有限。有关 在带有索引OPTIMIZE TABLE
的表上 运行的信息,请参阅第 12.10.6 节,“微调 MySQL 全文搜索”。FULLTEXT
INNODB_FT_DELETED
FULLTEXT
:存储从表的索引中删除的行InnoDB
。为了避免在索引的 DML 操作期间昂贵的索引重组InnoDB
FULLTEXT
,关于新删除的单词的信息被单独存储,当您进行文本搜索时从搜索结果中过滤掉,并且仅当您对表发出OPTIMIZE TABLE
语句时从主搜索索引中删除InnoDB
.INNODB_FT_DEFAULT_STOPWORD
:包含在表上创建索引时默认使用 的停用词列表 。FULLTEXT
InnoDB
有关该
INNODB_FT_DEFAULT_STOPWORD
表的信息,请参阅第 12.10.4 节,“全文停用词”。INNODB_FT_INDEX_TABLE
:提供有关用于处理针对表FULLTEXT
索引的 文本搜索的倒排索引的信息InnoDB
。INNODB_FT_INDEX_CACHE
FULLTEXT
:提供有关索引中新插入行的标记信息 。为了避免在 DML 操作期间进行昂贵的索引重组,有关新索引词的信息被单独存储,并且仅在OPTIMIZE TABLE
运行时、服务器关闭时或缓存大小超过innodb_ft_cache_size
or 定义的限制时才与主搜索索引结合innodb_ft_total_cache_size
系统变量。
除了
INNODB_FT_DEFAULT_STOPWORD
表格之外,这些表格最初都是空的。在查询其中任何一个之前,将
innodb_ft_aux_table
系统变量的值设置为包含FULLTEXT
索引的表的名称(包括数据库名称)(例如,test/articles
)。
示例 15.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
系统变量并OPTIMIZE TABLE
在包含FULLTEXT
索引的表上运行。此操作将索引缓存的内容刷新FULLTEXT
到主FULLTEXT
索引。innodb_optimize_fulltext_only
更改OPTIMIZE TABLE
语句对InnoDB
表的操作方式,并旨在在对InnoDB
具有FULLTEXT
索引的表进行维护操作期间临时启用。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
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 | +---------------------------+-------+
Disable
innodb_optimize_fulltext_only
,因为它只是暂时启用:mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;