文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  InnoDB INFORMATION_SCHEMA 全文索引表

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                     |
+-------------------------------------------+

表概述

注意

除了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 表(包含FULLTEXT 索引)期间暂时启用。

    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 |
    +------------+--------------+-------------+-----------+--------+----------+

    由于OPTIMIZE TABLE 操作刷新了FULLTEXT 索引缓存,因此INNODB_FT_INDEX_CACHE 表现在为空。

    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:用户定义停用词表的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     |
    +---------------------------+-------+
  10. 禁用innodb_optimize_fulltext_only,因为它仅在临时情况下启用

    mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;