MySQL--全文索引作用、原理及使用注意

作用

  MySQL索引可以分为:主键索引、普通索引、唯一索引、全文索引。其中,全文索引应该是是比较特殊的,它只有少数的几个存储引擎支持,且只有类型为char、vchar、text的列能建立全文索引。以前,只有MyISAM引擎支持全文索引,现在InnoDB也可以用了。

  一般情况,对于模糊查询的情况最容易想到的就是 where  ... like %_... 这样。确实,like 关键字在大都数情况下都能完成需求,但是在列的内容十分大的时候,like的性能就不能令人满意了,因为这个关键字并没有保证每次查询都能用上索引。因此,全文索引就派上用场。除了性能上的提高,全文索引提供了更灵活的服务,比如:

  1. like 只是进行模式匹配,全文索引却提供了一些语法语义的查询功能,会将要查的字符串进行分词操作,这决定于MySQL的词库。

  2. 全文索引可以自己设置词语的最小、最大长度,要忽略的词,这些都是可以设置的。

  3. 用全文索引去某个列查一个字符串,会返回匹配度,可以理解为匹配的关键字个数,是个浮点数。

总之就是,全文索引因为用上了索引,性能更高,有词库支撑可以进行分词提供了一些语义查询的功能,有词语停用表忽略某些词语,有词语最大最小值可以设置等更灵活。

 

原理

  全文索引的对象是一个“全文集合”,如果对表的多个列建立全文索引,MySQL就会将这几列拼接成一个字符串,然后进行索引。全文索引实际上也是B+ Tree结构,不过比较特殊,它一共有两层,第一层是所有的关键字,第二层则是每个关键字的一组指文档针,例如 “X” ->行1,行2,行3......。通俗解释全文索引结构就是:它是以关键字去找文档(行),而不是像其他一些索引以行主键来找其他列的内容。要使用全文索引,关于它的几个参数的意义一定要清楚,控制全文索引的参数都是以 ft 开头的(FullText)。查看这些参数以及它们的意义:

show variables like 'ft%'

ft_boolean_syntax:表示布尔查询时的可以用的符号。改变IN BOOLEAN MODE的查询字符,不用重新启动MySQL也不用重建索引

ft_max_word_len :  最长的索引字符串,默认值为84,修改后要重建索引

ft_min_word_len   : 最短的索引字符串,默认值为4,修改后要重建索引

ft_query_expansion_limit:  查询括展时取最相关的几个值用作二次查询

 ft_stopword_file    (built-in): 停词文件,这个文件里的词查询时会忽略掉

 

使用方法及注意

首先建立全文索引,语句如下:

create fulltext index 索引名 on 表名(列名...)

使用语句:

where match(列名...) against(‘ 词语1 词语2 ’); //匹配词语1 词语2

如果要使用布尔查询或短语查询,如果使用短语的话,速度会慢很多,因为全文索引无法判断是否精确匹配了短语,得回表过滤。:

where match(列名...) against(‘ “短语1” ’);  //在单引号里用双引号包裹一个短语,让返回结果精确匹配指定的短语
where match(列名...) against(‘ +词语1 -词语2 ’ IN BOOLEAN MODE);  //返回结果必须含有词语1,但不能有词语2
where match(列名...) against(‘ >词语1 <词语2 ’ IN BOOLEAN MODE);  //含有词语1的话优先级升高,含有词语2的话优先级降低

也可以把全文匹配的结果返回,这是一个浮点数,表示这一行关于这些词语的匹配度:

select id,match(列名...) against(' 词语1 ') as factor from 表名 where....    //返回每行匹配词语1的匹配度

 

全文索引带来的负面影响:

  1. 占有存储空间更大,如果内存一次装不下全部索引,性能会非常差。

  2. 增删改代价更大,修改文本中10个单词,则要操作维护索引10次,而不是普通索引的一次。

  3. 如果一个列上有全文索引则一定会用上,即使有性能更好的其他索引也不会用上。由于只是存储文档指针,也就用不上索引覆盖。

总之就是性能不如普通索引,使用时要衡量一下。

posted on 2020-12-09 00:01  ExplorerMan  阅读(603)  评论(0编辑  收藏  举报

导航