文档首页
MySQL 8.4 参考手册
8.4 中文镜像

MySQL 8.4 参考手册 · 中文镜像

正文为中文,英文原文默认隐藏。点击任意中文段落即可展开 / 收起对应英文原文。

打开官方英文原文 ↗

译文由机器翻译生成,仅供理解参考;有疑问请以官方英文原文为准。

MySQL 8.4 参考手册 / 17 InnoDB 存储引擎 / 17.15 InnoDB INFORMATION_SCHEMA 表 / 17.15.4 InnoDB INFORMATION_SCHEMA FULLTEXT 索引表
中文点击中文段落可显示 / 隐藏英文原文本页译文覆盖 100%

17.15.4 InnoDB INFORMATION_SCHEMA 全文索引表17.15.4 InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables

下表提供了 FULLTEXT 索引的元数据:The following tables provide metadata for FULLTEXT indexes:

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

Note

除了 INNODB_FT_DEFAULT_STOPWORD 表之外,这些表初始都是空的。在查询它们之前,将 innodb_ft_aux_table 系统变量的值设置为包含 FULLTEXT 索引的表的名称(包括数据库名称)(例如 test/articles)。With the exception of the INNODB_FT_DEFAULT_STOPWORD table, these tables are empty initially. Before querying any of them, set the value of the innodb_ft_aux_table system variable to the name (including the database name) of the table that contains the FULLTEXT index (for example, test/articles).

示例 17.5 InnoDB FULLTEXT 索引 INFORMATION_SCHEMA 表Example 17.5 InnoDB FULLTEXT Index INFORMATION_SCHEMA Tables

本示例使用一个带有 FULLTEXT 索引的表来演示 FULLTEXT 索引 INFORMATION_SCHEMA 表中包含的数据。This example uses a table with a FULLTEXT index to demonstrate the data contained in the FULLTEXT index INFORMATION_SCHEMA tables.

  1. 创建一个带有 FULLTEXT 索引的表并插入一些数据:Create a table with a FULLTEXT index and insert some data:

    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。Set the innodb_ft_aux_table variable to the name of the table with the FULLTEXT index. If this variable is not set, the InnoDB FULLTEXT INFORMATION_SCHEMA tables are empty, with the exception of INNODB_FT_DEFAULT_STOPWORD.

    mysql> SET GLOBAL innodb_ft_aux_table = 'test/articles';
    
  3. 查询 INNODB_FT_INDEX_CACHE 表,该表显示 FULLTEXT 索引中新插入行的信息。为了避免在 DML 操作期间进行昂贵的索引重组,新插入行的数据会保留在 FULLTEXT 索引缓存中,直到执行 OPTIMIZE TABLE(或者直到服务器关闭或缓存限制被超过)。Query the INNODB_FT_INDEX_CACHE table, which shows information about newly inserted rows in a FULLTEXT index. To avoid expensive index reorganization during DML operations, data for newly inserted rows remains in the FULLTEXT index cache until OPTIMIZE TABLE is run (or until the server is shut down or cache limits are exceeded).

    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表上的操作方式,旨在在对带有FULLTEXT索引的InnoDB表进行维护操作时临时启用。Enable the innodb_optimize_fulltext_only system variable and run OPTIMIZE TABLE on the table that contains the FULLTEXT index. This operation flushes the contents of the FULLTEXT index cache to the main FULLTEXT index. innodb_optimize_fulltext_only changes the way the OPTIMIZE TABLE statement operates on InnoDB tables, and is intended to be enabled temporarily, during maintenance operations on InnoDB tables with FULLTEXT indexes.

    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 索引缓存刷新出来的数据的信息。Query the INNODB_FT_INDEX_TABLE table to view information about data in the main FULLTEXT index, including information about the data that was just flushed from the FULLTEXT index cache.

    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 索引缓存。The INNODB_FT_INDEX_CACHE table is now empty since the OPTIMIZE TABLE operation flushed the FULLTEXT index cache.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5;
    Empty set (0.00 sec)
    
  6. 从 test/articles 表中删除一些记录。Delete some records from the test/articles table.

    mysql> DELETE FROM test.articles WHERE id < 4;
    
  7. 查询 INNODB_FT_DELETED 表。该表记录从 FULLTEXT 索引中删除的行。为了避免在 DML 操作期间进行代价高昂的索引重组,新删除记录的信息会单独存储,在进行文本搜索时会从搜索结果中过滤掉,并且在执行 OPTIMIZE TABLE 时从主搜索索引中移除。Query the INNODB_FT_DELETED table. This table records rows that are deleted from the FULLTEXT index. To avoid expensive index reorganization during DML operations, information about newly deleted records is stored separately, filtered out of search results when you do a text search, and removed from the main search index when you run OPTIMIZE TABLE.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
    +--------+
    | DOC_ID |
    +--------+
    |      2 |
    |      3 |
    |      4 |
    +--------+
    
  8. 运行 OPTIMIZE TABLE 以删除已删除的记录。Run OPTIMIZE TABLE to remove the deleted records.

    mysql> OPTIMIZE TABLE articles;
    +---------------+----------+----------+----------+
    | Table         | Op       | Msg_type | Msg_text |
    +---------------+----------+----------+----------+
    | test.articles | optimize | status   | OK       |
    +---------------+----------+----------+----------+
    

    INNODB_FT_DELETED 表现在应该是空的。The INNODB_FT_DELETED table should now be empty.

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
    Empty set (0.00 sec)
    
  9. 查询 INNODB_FT_CONFIG 表。该表包含有关 FULLTEXT 索引及相关处理的元数据:Query the INNODB_FT_CONFIG table. This table contains metadata about the FULLTEXT index and related processing:

    • optimize_checkpoint_limit:OPTIMIZE TABLE 操作停止前的秒数。optimize_checkpoint_limit: The number of seconds after which an OPTIMIZE TABLE run stops.

    • synced_doc_id:下一个要分配的 DOC_ID。synced_doc_id: The next DOC_ID to be issued.

    • stopword_table_name:用户定义的停用词表的database/table名称。如果没有用户定义的停用词表,则VALUE列为空。stopword_table_name: The database/table name for a user-defined stopword table. The VALUE column is empty if there is no user-defined stopword table.

    • use_stopword:指示是否使用停用词表,该项在创建FULLTEXT索引时定义。use_stopword: Indicates whether a stopword table is used, which is defined when the FULLTEXT index is created.

    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,因为它只打算临时启用:Disable innodb_optimize_fulltext_only, since it is intended to be enabled only temporarily:

    mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;