MySQL是最常用的关系数据库管理系统之一。我们都知道它快速易于使用。在MySQL中,存储引擎是处理SQL操作的组件。 InnoDB是MySQL中广泛使用的存储引擎。使SQL操作快速的原因之一是索引。如果正确创建索引,您的查询可能非常快。我们可以在int,char类型(一个单词)列上创建一个索引,但是我们还可以在基于文本的列上创建一个完整的索引,在该列中我们保存多字字符串。在此博客中,我将解释FullText索引的工作原理。
我们可以在创建表或更改表并创建索引时创建全文索引。 InnoDB全文索引具有倒数索引设计。什么是反向索引?倒置索引存储一个单词列表,并将该单词映射到该单词出现的文档中。当我们创建FullText索引时,InnoDB会创建一个隐藏的列fts_doc_id。此FTS_DOC_ID在索引表中使用将单词映射到文档。什么是索引表?当我们创建全文索引时,一组索引表也会自动创建。
索引表与十六进制值与索引表关联。例如,在上图中,索引表_id为2243,在十六进制中为8c3。因此索引表FTS_00000000000008C3
前六个索引表保存了该单词出现的单词和文档ID(FTS_DOC_ID)的映射。当插入任何新文档(具有完整文本索引的列中的数据)时,它已被令牌化,并且将单个单词(称为令牌)与该文档的doc_id一起插入索引表中在文档中。我们不会插入停止词。停止词是我们可以为完整文本索引目的而忽略的常用词的列表。您可以从表Innodb_ft_default_stopword中获取默认停止单词。这些单词根据每个单词的字符集排序重量在六个索引表中进行分区。如果索引表中已经存在任何单词,则我们更新并包括新文档的DOC_ID。如果我们为每个文档执行此完整过程,则可能会导致索引表中的许多插入,这可以使对这些表的同时访问成为争论点。为了避免此问题,InnoDB使用缓存。 InnoDB暂时缓存索引表插入最近的行,并插入插入,直到缓存已满。一旦缓存完成,InnoDB就会批量冲洗到磁盘。缓存和批处理行为避免了频繁更新索引表,这些索引表可能会在忙碌的插入和更新时间期间导致并发访问问题。批处理技术还避免了相同单词的多个插入,并最大程度地减少了重复条目。与其单独冲洗每个单词,不如将同一单词的插入合并并冲入磁盘作为单个条目,提高插入效率,同时保持索引表尽可能小。 innodb_ft_cache_index_table将新插入的行保存在fullText索引中。
索引删除
删除具有全文索引列的记录可能会导致索引表中的许多小删除,从而使对这些表的同时访问成为争论点。为了避免此问题,每当从索引表中删除记录时,删除文档的DOC_ID已记录在特殊的fts_ 上[1] - 。在返回查询结果之前,使用fts _deleted -table中的信息用于过滤删除doc_id。该设计的好处是,删除速度快速且价格便宜。缺点是删除记录后,索引的大小不会立即减小。要删除已删除记录的全文索引条目,请在索引表上使用Innodb_optimize_fulltext_only =在索引表上运行âoptarize_table =在重建全文索引上。
mySQL使用aming()对()语法执行全文搜索。我们提供所有由逗号隔开的列,需要在匹配中搜索,并且需要搜索的字符串。假设比赛中提供的列是索引的。当我们查询时,InnoDB检查字符串的索引表。如果存在字符串,则它将获取DOC_ID并使用DOC_ID获取行。
[1]:fts_00000000000008c3_deleted中的fts_000000000008c3_deleted在上图中包含用于删除的文档但尚未从全文索引中删除的文档的文档ID(DOC_ID)。 FTS_00000000000008C3_DELETED_CACHE是FTS_0000000000000008C3_DEATELTED的内存版本。我们首先将其保存在缓存中,然后缓存完整后,将其冲洗到fts _*_删除表。