Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables

17.15.4 InnoDB INFORMATION_SCHEMA 全文索引表

以下表提供了 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                     |
+-------------------------------------------+

表概述

Note

除了 INNODB_FT_DEFAULT_STOPWORD 表外,这些表最初为空。在查询任何这些表之前,设置 innodb_ft_aux_table 系统变量的值为包含 FULLTEXT 索引的表的名称(包括数据库名称,例如 test/articles)。

示例 17.5 InnoDB FULLTEXT 索引 INFORMATION_SCHEMA 表

本示例使用带有 FULLTEXT 索引的表来演示 FULLTEXT 索引 INFORMATION_SCHEMA 表中的数据。

  1. 创建一个带有 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 ...');
  2. innodb_ft_aux_table 变量设置为带有 FULLTEXT 索引的表的名称。如果不设置该变量,InnoDB FULLTEXT INFORMATION_SCHEMA 表将为空,除了 INNODB_FT_DEFAULT_STOPWORD 表。

    mysql> SET GLOBAL innodb_ft_aux_table = 'test/articles';
  3. 查询 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 |
    +------------+--------------+-------------+-----------+--------+----------+
  4. 启用 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       |
    +---------------+----------+----------+----------+
  5. 查询 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)
  6. test/articles 表中删除一些记录。

    mysql> DELETE FROM test.articles WHERE id < 4;
  7. 查询 INNODB_FT_DELETED 表。此表记录从 FULLTEXT 索引中删除的行。为了避免在 DML 操作期间昂贵的索引重新组织,在这里单独存储新删除的记录信息,从搜索结果中过滤出来,并在运行 OPTIMIZE TABLE 时从主搜索索引中删除。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
    +--------+
    | DOC_ID |
    +--------+
    |      2 |
    |      3 |
    |      4 |
    +--------+
  8. 运行 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)
  9. 查询 INNODB_FT_CONFIG 表。此表包含关于 FULLTEXT 索引和相关处理的元数据:

    • optimize_checkpoint_limitOPTIMIZE 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     |
    +---------------------------+-------+
  10. 禁用 innodb_optimize_fulltext_only,因为它只应临时启用:

    mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;