14.16.4 InnoDB INFORMATION_SCHEMA FULLTEXT 索引 table
下 table 提供了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 |
+-------------------------------------------+
Table Overview
-
INNODB_FT_CONFIG:提供有关
FULLTEXT
索引和InnoDB
table 的相关处理的元数据。 -
INNODB_FT_BEING_DELETED:提供INNODB_FT_DELETEDtable 的快照;它仅在OPTIMIZE TABLE维护操作期间使用。运行OPTIMIZE TABLE时,将清空INNODB_FT_BEING_DELETEDtable,并从INNODB_FT_DELETEDtable 中删除
DOC_ID
值。因为INNODB_FT_BEING_DELETED的内容通常具有较短的生存期,所以此 table 的监视或调试 Util 有限。有关在具有FULLTEXT
索引的 table 上运行OPTIMIZE TABLE的信息,请参见第 12.9.6 节“微调 MySQL 全文搜索”。 -
INNODB_FT_DELETED:存储从
InnoDB
table 的FULLTEXT
索引中删除的行。为避免在InnoDB
FULLTEXT
索引的 DML 操作期间进行昂贵的索引重组,有关新删除单词的信息将单独存储,在进行文本搜索时会从搜索结果中过滤掉,并且仅在发出OPTIMIZE TABLE语句时才从主搜索索引中删除InnoDB
table。 -
INNODB_FT_DEFAULT_STOPWORD:保留stopwords列 table,默认情况下在
InnoDB
table 上创建FULLTEXT
索引时使用。
有关INNODB_FT_DEFAULT_STOPWORDtable 的信息,请参见第 12.9.4 节“全文停用词”。
-
INNODB_FT_INDEX_TABLE:提供有关用于对
InnoDB
table 的FULLTEXT
索引进行文本搜索的倒排索引的信息。 -
INNODB_FT_INDEX_CACHE:提供有关
FULLTEXT
索引中新插入的行的令牌信息。为避免在 DML 操作期间进行昂贵的索引重组,仅在运行OPTIMIZE TABLE时,关闭服务器时或当高速缓存大小超过由定义的限制时,才将有关新索引词的信息分开存储,并与主搜索索引组合。 innodb_ft_cache_size或innodb_ft_total_cache_size系统变量。
Note
除了INNODB_FT_DEFAULT_STOPWORDtable 以外,这些 table 最初都是空的。在查询任何一个之前,请将innodb_ft_aux_table系统变量的值设置为包含FULLTEXT
索引的 table(例如test/articles
)的名称(包括数据库名称)。
例 14.5 InnoDB FULLTEXT 索引 INFORMATION_SCHEMAtable
本示例使用具有FULLTEXT
索引的 table 来演示FULLTEXT
索引INFORMATION_SCHEMA
table 中包含的数据。
- 创建一个具有
FULLTEXT
索引的 table 并插入一些数据:
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 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
索引的 table 的名称。如果未设置此变量,则InnoDB
FULLTEXT
INFORMATION_SCHEMA
table 为空,但INNODB_FT_DEFAULT_STOPWORD除外。
SET GLOBAL innodb_ft_aux_table = 'test/articles';
- 查询INNODB_FT_INDEX_CACHEtable,该 table 显示有关
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
索引的 table 上运行OPTIMIZE TABLE。此操作将FULLTEXT
索引缓存的内容刷新到主FULLTEXT
索引。 innodb_optimize_fulltext_only更改OPTIMIZE TABLE语句在InnoDB
table 上的操作方式,并打算在对带有FULLTEXT
索引的InnoDB
table 进行维护操作期间临时启用。
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_TABLEtable 以查看有关主要
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_CACHEtable 现在为空。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5;
Empty set (0.00 sec)
- 从
test/articles
table 中删除一些记录。
mysql> DELETE FROM test.articles WHERE id < 4;
- 查询INNODB_FT_DELETEDtable。该 table 记录了从
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_DELETEDtable 现在应该为空。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
Empty set (0.00 sec)
-
查询INNODB_FT_CONFIGtable。下 table 包含有关
FULLTEXT
索引和相关处理的元数据: -
optimize_checkpoint_limit
:停止OPTIMIZE TABLE运行的秒数。 -
synced_doc_id
:下一个要发布的DOC_ID
。 -
stopword_table_name
:用户定义的停用词 table 的*database/table
*名称。如果没有用户定义的停用词 table,则VALUE
列为空。 -
use_stopword
:指示是否使用停用词 table,该词在创建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;