MYSQL存储引擎InnoDB(二十四):InnoDB全文索引(上)
全文索引可以通过CREATE TABLE、 ALTER TABLE或CREATE INDEX添加到现有表中。
全文索引在基于文本的列(CHAR、 VARCHAR或 TEXT列)上创建,以加快对这些列中包含的数据的查询和 DML 操作。 全文索引可以通过CREATE TABLE、 ALTER TABLE或CREATE INDEX添加到现有表中。 使用MATCH() ... AGAINST执行全文搜索。 InnoDB全文索引设计 InnoDB全文索引采用倒排索引设计。倒排索引存储单词列表,并且对于每个单词mysql索引表,存储该单词出现的文档列表。为了支持邻近搜索,还存储每个单词的位置信息,作为字节偏移量。 InnoDB 全文索引表 创建InnoDB全文索引时,会创建一组索引表,如下例所示:
前六个索引表包含倒排索引,称为辅助索引表。当传入的文档被标记化时,各个单词(也称为 “标记”)连同位置信息和相关联的 DOC_ID根据单词第一个字符的字符集排序权重。单词在六个索引表中被完全排序和分区。 倒排索引被划分为六个辅助索引表,以支持并行索引创建。默认情况下,两个线程对单词和相关数据进行标记、排序和插入到索引表中。执行此工作的线程数可使用该innodb_ft_sort_pll_degree 变量进行配置。在大型表上创建全文索引时,请考虑增加线程数。 辅助索引表名称以fts_为前缀,index_#为后缀 。每个辅助索引表通过辅助索引表名称中与索引表的table_id匹配的十六进制值与索引表相关联 。例如,表test/opening_linestable_id是 327,其十六进制值为 0x147。如上例所示,“ 147 ”十六进制值出现在与test/opening_lines表关联的辅助索引表的名称中。 表示全文索引的index_id的十六进制值也出现在辅助索引表名称中。例如,在辅助表名 test/fts_0000000000000147_00000000000001c9_index_1中,十六进制值1c9的十进制值是 457。表上定义的索引opening_lines( idx) 可以通过在 INFORMATION_SCHEMA.INNODB_INDEXES 表中查询该值 (457) 来识别。
如果在独立表空间中创建主表,则索引表存储在它们自己的表空间中。否则,索引表将存储在索引表所在的表空间中。 上例中显示的其他索引表称为普通索引表,用于删除处理和存储全文索引的内部状态。与为每个全文索引创建的倒排索引表不同,这组表对于在特定表上创建的所有全文索引是通用的。 即使删除全文索引,也会保留公共索引表。删除全文索引时, 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 表。 (编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |