-
Notifications
You must be signed in to change notification settings - Fork 111
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)
- 验证、测试、整理:罗小波
- QQ:309969177
- 提示:本系列文章的主体结构遵循Oracle MySQL 官方 5.7 手册中,关于information_schema、mysql schema、performance_schema、sys schema的章节结构体系,并额外添加了一些验证、测试数据。鉴于本人精力和能力有限,难免出现一些纰漏,欢迎大家踊跃指正!