zoukankan      html  css  js  c++  java
  • 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. 如果一个列上有全文索引则一定会用上,即使有性能更好的其他索引也不会用上。由于只是存储文档指针,也就用不上索引覆盖。

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

  • 相关阅读:
    VMware安装Centos7超详细过程
    Linux部署Web项目
    Entity Framework快速入门IQueryable与IEnumberable的区别
    ASP.NET MVC3中的路由系统(Routes)
    C# Lambda表达式概述
    WCF大数据量传输解决要点
    div滚动条样式设计
    ASP.NET MVC 自定义路由
    C# Lambda表达式学习笔记
    C# 操作excel
  • 原文地址:https://www.cnblogs.com/ExMan/p/14106424.html
Copyright © 2011-2022 走看看