当前位置:   article > 正文

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

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%'

fbf6607b5007b8b5ce08440af07745e8.png

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

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

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/168433
推荐阅读
相关标签
  

闽ICP备14008679号