Skip to content

INNODB_FT_INDEX_TABLE

xiaoboluo768 edited this page Jun 7, 2020 · 2 revisions
  • 该表中提供查询关于innodb表全文索引中用于反向文本查找的倒排索引的分词信息
  • 可以通过设置innodb_ft_aux_table来观察倒排索引的辅助表:SET GLOBAL innodb_ft_aux_table='test/test'; 设置之后,就可以在information_schema下的表INNODB_FT_INDEX_TABLE得到表test中的分词信息,为了支持全文检索,必须有一个列与word进行映射。在InnoDB中这个列被命名成FTS_DOC_ID,其类型为BIGINT UNSIGNED NOT NULL,并且InnoDB存储引擎自动会在该列加上一个名为FTS_DOC_ID_INDEX的Unique Index.这些操作由存储引擎自己完成,用户也可以在建表时自动添加FTS_DOC_ID,以及对应的Unique Index。由于列名FTS_DOC_ID聚友特殊意义,因此在创建时必须注意相应的类型,否则会报错
  • 文档中的分词的插入操作是在事务提交时完成,但是对于删除操作,其在事务提交时,不删除磁盘Auxiliary Table的记录,而只是删除FTS Cache Index记录,对于Auxiliary Table中被删除的记录,存储引擎会记录其FTS DOCUMENT ID ,并将其保存在DELETE auxiliary table中,在设置参数innodb_ft_aux_table后,用户可以访问information_schema架构下的表INNODB_FT_DELETED来观察删除的FTS Document ID
  • 由于文档的DML操作实际并不删除索引中的数据,相反还会在对应的DELETED表中插入记录,因此随着应用程序的允许,索引会变得越来越大,即使索引中的有些数据已经被删除,查询也不会选择这类记录,为此,InnoDB提供了一种方式,允许用户手工将已删除的记录从索引中彻底删除,这就是OPTIMIZE TABLE。因为OPTIMIZE TABLE还会进行一些其他的操作。如Cardinality重新统计,若用户希望对倒排索引进行操作,可以通过innodb_optimize_fulltext_only设置:SET GLOBAL innodb_optimize_fulltext_only=1;OPTIMIZE TABLE test;(该操作会将全文索引的缓存信息刷新到磁盘)
  • 若被删除的文档很多,那么OPTIMIZE TABLE操作可能占用非常多的时间,会影响到程序并发性,并极大的降低用户的响应时间,用户可以通过参数innodb_ft_num_word_optimize来限制每次实际删除的分词数量,默认为2000
  • 查询该表的账户需要有PROCESS权限,该表为Memory引擎临时表
  • 表定义语句
CREATE TEMPORARY TABLE `INNODB_FT_INDEX_TABLE` (
  `WORD` varchar(337) NOT NULL DEFAULT '',
  `FIRST_DOC_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
  `LAST_DOC_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
  `DOC_COUNT` bigint(21) unsigned NOT NULL DEFAULT '0',
  `DOC_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
  `POSITION` bigint(21) unsigned NOT NULL DEFAULT '0'
) ENGINE=MEMORY DEFAULT CHARSET=utf8
  • 表字段含义:与INNODB_FT_INDEX_CACHE表字段含义相同
  • 表记录内容示例
# 启用innodb_optimize_fulltext_only系统配置参数
root@localhost : test 12:28:29> SET GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.00 sec)

# 执行优化表语句
root@localhost : test 12:28:41>  OPTIMIZE TABLE test;
+-----------+----------+----------+----------+
| Table    | Op      | Msg_type | Msg_text |
+-----------+----------+----------+----------+
| test.test | optimize | status  | OK      |
+-----------+----------+----------+----------+
1 row in set (0.02 sec)

# 设置innodb_ft_aux_table 系统配置参数为刚刚执行优化的表
root@localhost : test 12:28:48> SET GLOBAL innodb_ft_aux_table = 'test/test';
Query OK, 0 rows affected (0.00 sec)

# 查询INNODB_FT_INDEX_TABLE 表中记录的值
root@localhost : test 12:28:55> select * from information_schema.INNODB_FT_INDEX_TABLE ;
+----------+--------------+-------------+-----------+--------+----------+
| WORD    | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+----------+--------------+-------------+-----------+--------+----------+
| edf      |            9 |          10 |        2 |      9 |        0 |
| edf      |            9 |          10 |        2 |    10 |        0 |
| edfa    |            9 |          10 |        2 |      9 |        4 |
| edfa    |            9 |          10 |        2 |    10 |        4 |
| eeee    |            8 |          8 |        1 |      8 |        4 |
| eeeesdf  |            9 |          9 |        1 |      9 |        9 |
| eeeesdfs |          10 |          10 |        1 |    10 |        9 |
| dddd    |            3 |          5 |        3 |      3 |        4 |
| dddd    |            3 |          5 |        3 |      4 |        4 |
| dddd    |            3 |          5 |        3 |      5 |        4 |
| ddde    |            6 |          6 |        1 |      6 |        4 |
| ddee    |            7 |          7 |        1 |      7 |        4 |
+----------+--------------+-------------+-----------+--------+----------+
12 rows in set (0.00 sec)

上一篇:INNODB_FT_DEFAULT_STOPWORD表 |下一篇:INNODB_FT_INDEX_CACHE表

Clone this wiki locally