如果你自行定义 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.
作为只读变量,ngram_token_size只能在启动配置或者配置文件中指定
与默认的解析器相差不大,多了一句:xxx WITH PARSER ngram
Ngram在解析时去除空格,如
MySQL内建的默认全文检索解析器将单词与Stopword列表中的做对比,如果单词与Stopword列表中的元素相同的话,这个单词则不会被索引 。对于Ngram解析器,Stopword的处理方式不同 。Ngram解析器不排除与stopword列表中的条目相等的token,而是排除包含stopwords的token 。例如,假设 ngram_token_size=2 ,包含“a,b”的文档将被解析为 “a,” h和“,b” 。如果将逗号(“,”)定义为停止字,则 “a,”和“,b”都将不会加入索引中,因为它们包含逗号 。
- mysql游标和存储过程是什么 mysql游标表名为变量
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么设置时区 mysql时间显示设置
- 招聘要精通mysql
- mysql 65535 8192 限制 mysql限制资源使用
- mysql有topn
- mysql协议包解析 mysqlicp协议
- mysql子查询和连接查询 mysql子查询插入
- Mysql使用索引查询 mysql使用round
- 云服务器游戏出现黑屏问题怎么解决? 云服务器游戏黑屏怎么办
