加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MYSQL存储引擎InnoDB(二十四):InnoDB全文索引(上)

发布时间:2022-10-18 13:32:26 所属栏目:MySql教程 来源:网络
导读: 全文索引在基于文本的列(CHAR、 VARCHAR或 TEXT列)上创建,以加快对这些列中包含的数据的查询和 DML 操作。
全文索引可以通过CREATE TABLE、 ALTER TABLE或CREATE INDEX添加到现有表中。

全文索引在基于文本的列(CHAR、 VARCHAR或 TEXT列)上创建,以加快对这些列中包含的数据的查询和 DML 操作。

全文索引可以通过CREATE TABLE、 ALTER TABLE或CREATE INDEX添加到现有表中。

使用MATCH() ... AGAINST执行全文搜索。

InnoDB全文索引设计

InnoDB全文索引采用倒排索引设计。倒排索引存储单词列表,并且对于每个单词mysql索引表,存储该单词出现的文档列表。为了支持邻近搜索,还存储每个单词的位置信息,作为字节偏移量。

InnoDB 全文索引表

创建InnoDB全文索引时,会创建一组索引表,如下例所示:

mysql> CREATE TABLE opening_lines (
       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
       opening_line TEXT(500),
       author VARCHAR(200),
       title VARCHAR(200),
       FULLTEXT idx (opening_line)
       ) ENGINE=InnoDB;
mysql> SELECT table_id, name, space from INFORMATION_SCHEMA.INNODB_TABLES
       WHERE name LIKE 'test/%';
+----------+----------------------------------------------------+-------+
| table_id | name                                               | space |

+----------+----------------------------------------------------+-------+
|      333 | test/fts_0000000000000147_00000000000001c9_index_1 |   289 |
|      334 | test/fts_0000000000000147_00000000000001c9_index_2 |   290 |
|      335 | test/fts_0000000000000147_00000000000001c9_index_3 |   291 |
|      336 | test/fts_0000000000000147_00000000000001c9_index_4 |   292 |
|      337 | test/fts_0000000000000147_00000000000001c9_index_5 |   293 |
|      338 | test/fts_0000000000000147_00000000000001c9_index_6 |   294 |
|      330 | test/fts_0000000000000147_being_deleted            |   286 |
|      331 | test/fts_0000000000000147_being_deleted_cache      |   287 |
|      332 | test/fts_0000000000000147_config                   |   288 |
|      328 | test/fts_0000000000000147_deleted                  |   284 |
|      329 | test/fts_0000000000000147_deleted_cache            |   285 |
|      327 | test/opening_lines                                 |   283 |
+----------+----------------------------------------------------+-------+

前六个索引表包含倒排索引,称为辅助索引表。当传入的文档被标记化时,各个单词(也称为 “标记”)连同位置信息和相关联的 DOC_ID根据单词第一个字符的字符集排序权重。单词在六个索引表中被完全排序和分区。

倒排索引被划分为六个辅助索引表,以支持并行索引创建。默认情况下,两个线程对单词和相关数据进行标记、排序和插入到索引表中。执行此工作的线程数可使用该innodb_ft_sort_pll_degree 变量进行配置。在大型表上创建全文索引时,请考虑增加线程数。

辅助索引表名称以fts_为前缀,index_#为后缀 。每个辅助索引表通过辅助索引表名称中与索引表的table_id匹配的十六进制值与索引表相关联 。例如,表test/opening_linestable_id是 327,其十六进制值为 0x147。如上例所示,“ 147 ”十六进制值出现在与test/opening_lines表关联的辅助索引表的名称中。

mysql索引表_mysql 表字段加索引_mysql 表 索引

表示全文索引的index_id的十六进制值也出现在辅助索引表名称中。例如,在辅助表名 test/fts_0000000000000147_00000000000001c9_index_1中,十六进制值1c9的十进制值是 457。表上定义的索引opening_lines( idx) 可以通过在 INFORMATION_SCHEMA.INNODB_INDEXES 表中查询该值 (457) 来识别。

mysql> SELECT index_id, name, table_id, space from INFORMATION_SCHEMA.INNODB_INDEXES
       WHERE index_id=457;
+----------+------+----------+-------+
| index_id | name | table_id | space |
+----------+------+----------+-------+
|      457 | idx  |      327 |   283 |
+----------+------+----------+-------+

如果在独立表空间中创建主表,则索引表存储在它们自己的表空间中。否则,索引表将存储在索引表所在的表空间中。

上例中显示的其他索引表称为普通索引表,用于删除处理和存储全文索引的内部状态。与为每个全文索引创建的倒排索引表不同,这组表对于在特定表上创建的所有全文索引是通用的。

即使删除全文索引,也会保留公共索引表。删除全文索引时, FTS_DOC_ID会保留为该索引创建的列,因为删除FTS_DOC_ID 列将需要重建先前索引的表。需要公共索引表来管理 FTS_DOC_ID列。

以下是几个重要概念:

1、fts_*_deleted和 fts_*_deleted_cache

包含已删除但其数据尚未从全文索引中删除的文档的文档 ID (DOC_ID)。fts_*_deleted_cache是fts_*_deleted表的内存版本 。

2、fts_*_being_deleted和 fts_*_being_deleted_cache

包含已删除且当前正在从全文索引中删除其数据的文档的文档 ID (DOC_ID)。 fts_*_being_deleted_cache表是fts_*_being_deleted表的内存版本 。

3、fts_*_config

存储有关全文索引的内部状态的信息。最重要的是,它存储 FTS_SYNCED_DOC_ID。FTS_SYNCED_DOC_ID标识已解析并刷新到磁盘的文档。在崩溃恢复的情况下,FTS_SYNCED_DOC_ID 值用于识别尚未刷新到磁盘的文档,以便可以重新解析文档并将其添加回全文索引缓存。要查看此表中的数据,请查询该INFORMATION_SCHEMA.INNODB_FT_CONFIG 表。

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!