全文索引缓存只缓存最近插入的行,查询时,已经刷入磁盘(附属索引表)的数据不会再回到索引缓存中 。附属索引表中的内容是直接查询的,最终返回的结果返回前需要将附属索引表的结果和索引缓存中的结果合并 。
InnoDB使用被称作DOC_ID的唯一文件描述符,将全文索引中的单词与该单词在文档中的记录映射起来 。映射关系需要索引表中的 FTS_DOC_ID 列 。在创建全文索引时,如果没有定义 FTS_DOC_ID 列,InnoDB会自动的加入一个隐藏的 FTS_DOC_ID 列 。下面是一个例子,
CREATE FULLTEXT INDEX ft_index ON xxxxxxxx(CONTEXT)
[2021-11-12 18:14:04] [HY000][124] InnoDB rebuilding table to add column FTS_DOC_ID
重点看一下这一行: [HY000][124] InnoDB rebuilding table to add column FTS_DOC_ID,InnoDB重新构建了这个表,并且添加了一个列 FTS_DOC_ID。
在CREATE TABLE的过程中添加 FTS_DOC_ID 的时间成本要低于在已经有数据的表上建立全文索引 。如果在表加载数据之前定义 FTS_DOC_ID 列,这个表和它的索引都不需要为了新增列而重新构建 。如果你不需要考虑 CREATE FULLTEXT INDEX 的性能,可以让InnoDB为你创建 FTS_DOC_ID 列 。InnoDB会新增一个隐藏的 FTS_DOC_ID 列,并且在 FTS_DOC_ID 上建立唯一索引(FTS_DOC_ID_INDEX) 。如果你想自行创建 FTS_DOC_ID 列,这个列必须定义为 BIGINT UNSIGNED NOT NULL 且命名为FTS_DOC_ID(全大写),如下例子:
如果你自行定义 FTS_DOC_ID 列的话,你需要负责管理这个列,避免空值(empty)或者重复值 。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会自动创建 。
在MySQL 5.7.13前,允许更大FTS_DOC_ID与最新的FTS_DOC_ID之间的间隔为10000,在MySQL 5.7.13及之后的版本中,这个允许的间隔为65535 。
为了避免重新构建表,FTS_DOC_ID列在删除了全文索引之后依然被保留 。
删除被索引文件的一个记录,可能会在附属索引表中产生非常多的小的删除项,在并发访问时,会产生热点问题 。为了避免这个问题,每当被索引表中的记录被删除时,会将被删文档的DOC_ID记录在一个特别的 FTS_*_DELETED 表中,同时全文索引中已经索引了的记录依然被保存 。在返回查询结果前,使用 FTS_*_DELETED 中的信息去过滤掉已经删除掉了的DOC_ID 。这种设计的优势在于删除速度快且消耗低 。不好的地方在于索引的大小不能随着记录的删除而立即减少 。为了删除已删除记录在全文索引中的项,需要对被索引的表执行OPTIMIZE TABLE,配合[ innodb_optimize_fulltext_only=ON ],去重构全文索引 。
细节略,有例子:
全文搜索只能看到已经提交了的数据 。
你可以通过查询下面的INFORMATION_SCHEMA表,来监控或测试InnoDB的一些特殊文本处理 。
默认的分词器不支持中文,不能检索到中文中的英文单词 。
InnoDB默认的Stopwords:
select * from information_schema.INNODB_FT_DEFAULT_STOPWORD;
SQL中的关键词(保留关键字):
Shell中的关键词:for,while,echo
其他:###, ***, --,
被索引表数据量、索引表数据量
模糊匹配与严格匹配的性能差距
需要将 innodb_optimize_fulltext_only 配置为ON,这里是否需要DBA在MySQL镜像中修改?
innodb_optimize_fulltext_only 设置为ON后,对系统有何影响需要评估 。
innodb_optimize_fulltext_only
执行的时间、频率 。
MySQL内建的全文检索解析器使用单词之间的空白作为分隔符以标识单词的头尾,但是这里有个限制,对于表意文字,它是没有单词分隔符的 。为了解决这个限制,MySQL提供了支持中文、日语、韩语的 ngram 解析器 。ngram解析器支持InnoDB和MyISAM 。
Ngram是内建在服务中的插件,像其他自建在服务中的插件一样,服务启动时会自动加载它 。全文检索的语法参考上面(Section 12.10, “Full-Text Search Functions”),这里只讨论一些不同的地方 。除了单词的最小、更大长度配置项([ innodb_ft_min_token_size ]innodb_ft_max_token_size,ft_min_word_len,ft_max_word_len,全文检索依赖一些配置项都是可以使用的 。
Ngram默认索引的单词(token)的大小为2( 2bigram ) 。例如,索引的大小为2,Ngram解析器解析字符串“abc def”为四个单词元素(tokens):“ab”, “bc”, “de” and “ef” 。
ngram token size is configurable using thengram_token_sizeconfiguration option,which has a minimum value of 1 and maximum value of 10.
推荐阅读
- 女孩缺土取名大全文雅 雅致的女孩名字
- 晋平公问于祁黄羊全文翻译 晋平公问于祁黄羊曰全文翻译
- 郁离子僰人舞猴翻译 《郁离子.僰人舞猴》全文怎么翻译
- 卿卿我我全文免费阅读,卿卿我我小说全文免费阅读无弹窗
- 《我在天庭朝九晚五》txt下载在线阅读全文,求百度网盘云资源
- 手机创建讨论组 手机怎样建讨论组
- 清平乐·村居古诗 清平乐·村居古诗全文
- 如何创建数据库——数据库的基本操作
- 百家姓全文文本 百家姓全文是哪些
- 奥古斯特·霍希是一开始就创建了奥迪吗 奥古斯特·霍希