MyISAM全文索引面向“全文集合”,将所有需要索引的列连接到字符串中并进行索引。 这是一种特殊的双BTree索引,共有两个层次,第一个层次是所有关键字,每个关键字都有一组文档指针。
全文索引的单词过滤规则:
1 .禁止字列表中的字不被索引。 默认的禁止字基于普通英语设置,可以使用参数ft_stopword_file指定一组使用自定义禁止字的外部文件
2 .长度小于ft_min_word_len的单词和长度小于ft_max_word_len的单词不会被索引
全文索引不存储关键字与哪个列具体匹配。 如果需要对每列进行组合查询,则不需要为每列编制索引。 因此,在MATCH AGAINST子句中,所有列的相关性同等重要。
自然语言全文索引
关联度在:索引中出现次数越少的词,关联度越高,如果在此处发生50%以上的自然语言检索,则不会检索该词。 因此,如果数据集合较少,则全文索引查询通常不会返回结果
自然语言全文索引查询示例:
SELECT film_id、title、right (描述,25 )、
匹配(title,描述)代理(factorycasualties ) asrelevancefromsakila.film _ textwherematch ) title,描述
与常规查询不同,自然语言全文索引按相关顺序排序。 一次查询两次匹配)不会产生额外的消耗,MySQL会自动识别并搜索值。 另外,MATCH ) )函数中指定的列必须与索引的列完全相同,才能使用全文索引
布尔型全文索引
布尔全文索引可以使用特定前缀修饰符自定义索引。 功能如下图所示
使用案例
SELECT film_id、title、right (描述,25 ) froms akila.film _ textwherematch (title,描述) )。
代理(工厂评估集成模式) )。
结果准确一致,只有一个记录
全文索引限制
1 .全文索引在完全读取内存之前并不是很快。 否则,会产生大量的随机IO,因此速度非常低
2 .全文索引的操作成本较大,修改一段文本的100个单词需要100次索引操作
如果使用匹配代理的列具有全文索引,则无论性能如何,都将使用该全文索引,而忽略其他可用索引。 (新版本似乎对此有所改进,但如果有更好的索引就使用。) )。
4 .全文索引只能全文检索,其他WHERE条件只能在全文检索返回记录后执行
5 .全文索引不包含索引列的实际值,因此无法进行索引复盖扫描
6 .如果需要使用非依赖性排序全文索引,则必须使用文件排序(filesort )
优化全文索引
使用优化表减少碎片问题
2 .保证索引缓存足够大
3 .若要使用适当的同义词库(例如,索引与MySQL相关的文档),建议在同义词库中包含“MySQL”。 因为在这些文件中这个词经常出现
4 .忽略太短的词语会提高全文索引的效率,但同时检索精度会降低。 这需要权衡
5 .如果需要将大量数据导入包含全文索引的表中,请首先在DISABLE KEYS中禁用索引,然后在导入完成后在ENABLE KEY中打开索引