17.15.4 InnoDB INFORMATION_SCHEMA FULLTEXT索引表
以下表提供了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表将被清空,并从INNODB_FT_DELETED表中删除
DOC_ID
值。由于INNODB_FT_BEING_DELETED表的内容通常具有短暂的生命周期,这个表对监控或调试没有太多实用价值。关于在OPTIMIZE TABLE中使用FULLTEXT索引的信息,请参阅第14.9.6节,“MySQL全文搜索优化”。 -
INNODB_FT_DELETED: 存储对
InnoDB
表的FULLTEXT
索引进行删除操作时删除的行。为了避免在 DML 操作中对InnoDB
FULLTEXT
索引进行昂贵的索引重组,关于新删除的单词信息将单独存储,filtered out of search results when you do a text search,并且在您为InnoDB
表发出OPTIMIZE TABLE
语句时从主搜索索引中删除。 -
INNODB_FT_DEFAULT_STOPWORD: 持有用于默认情况下创建
InnoDB
表的FULLTEXT
索引时使用的stopwords 列表。关于INNODB_FT_DEFAULT_STOPWORD 表的信息,请见第14.9.4节,“Full-Text Stopwords”。
-
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
表外,这些表都是空的。 bevor查询任何一个表,设置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操作期间昂贵的索引重组,新的插入行数据直到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 | +------------+--------------+-------------+-----------+--------+----------+
-
启用
innodb_optimize_fulltext_only
系统变量,并在包含FULLTEXT
索引的表上运行OPTIMIZE TABLE
。该操作将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操作期间进行昂贵的索引重组,关于新删除的记录信息单独存储,filtered out of search results when you do a text search,并且在运行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;