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

MYSQL存储引擎InnoDB(二十五):InnoDB全文索引(中)

发布时间:2023-01-11 11:31:44 所属栏目:MsSql教程 来源:网络
导读: InnoDB 全文索引缓存
插入文档时,将对其进行标记化,并将单个单词和相关数据插入到全文索引中。这个过程,即使对于小文档,也可能导致对辅助索引表的大量小插入,从而使对这些表的并发访问

InnoDB 全文索引缓存

插入文档时,将对其进行标记化,并将单个单词和相关数据插入到全文索引中。这个过程,即使对于小文档,也可能导致对辅助索引表的大量小插入,从而使对这些表的并发访问成为争用点。为避免此问题,请使用InnoDB全文索引缓存来临时缓存最近插入的行的索引表插入。这种内存缓存结构保持插入,直到缓存已满,然后将它们批量刷新到磁盘(到辅助索引表)。您可以查询 INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE 表以查看最近插入的行的标记化数据。

缓存和批量刷新行为避免了对辅助索引表的频繁更新mssql重建索引,这可能导致在繁忙的插入和更新时间出现并发访问问题。批处理技术还避免了同一个词的多次插入,并最大限度地减少了重复条目。不是单独刷新每个单词,而是将相同单词的插入合并作为单个条目刷新到磁盘,从而提高插入效率,同时保持辅助索引表尽可能小。

innodb_ft_cache_size 变量用于配置全文索引缓存大小(基于每个表),这会影响刷新全文索引缓存的频率。 您还可以使用innodb_ft_total_cache_size变量为给定实例中的所有表定义全局全文索引缓存大小限制 。

全文索引缓存存储与辅助索引表相同的信息。但是,全文索引缓存仅缓存最近插入的行的标记化数据。已经刷新到磁盘(到辅助索引表)的数据在查询时不会被带回全文索引缓存。查询时,直接查询辅助索引表中的数据,将辅助索引表中的结果与全文索引缓存中的结果合并后返回。

InnoDB 全文索引 DOC_ID 和 FTS_DOC_ID 列

InnoDB使用称为DOC_ID的唯一文档标识符将全文索引中的单词映射到该单词出现的文档记录。映射需要索引表上的FTS_DOC_ID列。如果未定义FTS_DOC_ID列,则在InnoDB创建全文索引时自动添加隐藏FTS_DOC_ID列。下面的示例演示了这种行为。

下表定义不包含 FTS_DOC_ID列:

mysql> CREATE TABLE opening_lines (
       id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
       opening_line TEXT(500),
       author VARCHAR(200),
       title VARCHAR(200)
       ) ENGINE=InnoDB;

当您使用CREATE FULLTEXT INDEX在表上创建全文索引时 ,将返回警告,报告InnoDB正在重建表以添加FTS_DOC_ID 列。

mysql> CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);
Query OK, 0 rows affected, 1 warning (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 1
mysql> SHOW WARNINGS;
+---------+------+--------------------------------------------------+
| Level   | Code | Message                                          |
+---------+------+--------------------------------------------------+
| Warning |  124 | InnoDB rebuilding table to add column FTS_DOC_ID |
+---------+------+--------------------------------------------------+

使用 ALTER TABLE向没有 FTS_DOC_ID列的表添加全文索引时返回相同的警告。如果您在CREATE TABLE时创建全文索引且未指定FTS_DOC_ID列, 则InnoDB添加隐藏 FTS_DOC_ID列,而不会发出警告。

与在已加载数据的表上创建全文索引相比,在CREATE TABLE定义FTS_DOC_ID列的成本更低。如果 在加载数据之前在表上定义了FTS_DOC_ID列,则不必重建表及其索引来添加新列。如果您不关心CREATE FULLTEXT INDEX性能,请忽略FTS_DOC_ID列以便 InnoDB为您创建它。 InnoDB会创建一个隐藏 FTS_DOC_ID列以及 FTS_DOC_ID列上的唯一索引 ( FTS_DOC_ID_INDEX)。如果要创建自己的FTS_DOC_ID列,则必须将列定义为BIGINT UNSIGNED NOT NULL并命名 FTS_DOC_ID(全部大写),如下例所示:

mysql> CREATE TABLE opening_lines (
       FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
       opening_line TEXT(500),
       author VARCHAR(200),
       title VARCHAR(200)
       ) ENGINE=InnoDB;

如果您选择自己定义FTS_DOC_ID列,则您有责任管理该列以避免空值或重复值。FTS_DOC_ID值不能被重用,这意味着FTS_DOC_ID 值必须不断增加。

或者,您可以在FTS_DOC_ID列上创建所需的唯一 FTS_DOC_ID_INDEX(全部大写) 。

mysql> CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on opening_lines(FTS_DOC_ID);

如果您不创建FTS_DOC_ID_INDEX, InnoDB则会自动创建它。

为避免重建表,删除全文索引时会保留FTS_DOC_ID 列。

(编辑:源码网)

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