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_DEFAULT_STOPWORDtable 的信息,请参见第 12.9.4 节“全文停用词”

  • INNODB_FT_INDEX_TABLE:提供有关用于对InnoDBtable 的FULLTEXT索引进行文本搜索的倒排索引的信息。

  • INNODB_FT_INDEX_CACHE:提供有关FULLTEXT索引中新插入的行的令牌信息。为避免在 DML 操作期间进行昂贵的索引重组,仅在运行OPTIMIZE TABLE时,关闭服务器时或当高速缓存大小超过由定义的限制时,才将有关新索引词的信息分开存储,并与主搜索索引组合。 innodb_ft_cache_sizeinnodb_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_SCHEMAtable 中包含的数据。

  • 创建一个具有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 ...');
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 |
+------------+--------------+-------------+-----------+--------+----------+
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/articlestable 中删除一些记录。
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 |
+--------+
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     |
+---------------------------+-------+
mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;