文章目录

  • 概念
  • 版本支持
  • 使用全文索引
  • 测试全文索引
  • 总结
  • 几个注意点

概念

通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

你可能没有注意过全文索引,不过至少应该对一种全文索引技术比较熟悉:各种的搜索引擎。虽然搜索引擎的索引对象是超大量的数据,并且通常其背后都不是关系型数据库,不过全文索引的基本原理是一样的。

版本支持

开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

  • MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
  • MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
  • 只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。

使用全文索引

和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如

select * from fulltext_test where match(content,tag) against('xxx xxx');

注意: match() 函数中指定的列必须和全文索引中指定的列完全相同,否则就会报错,无法使用全文索引,这是因为全文索引不会记录关键字来自哪一列。如果想要对某一列使用全文索引,请单独为该列创建全文索引。

测试全文索引

有了上面的知识,就可以测试一下全文索引了。

首先创建测试表,插入测试数据

create table test (id int(11) unsigned not null auto_increment,content text not null,primary key(id),fulltext key content_index(content)
) engine=MyISAM default charset=utf8;insert into test (content) values ('a'),('b'),('c');
insert into test (content) values ('aa'),('bb'),('cc');
insert into test (content) values ('aaa'),('bbb'),('ccc');
insert into test (content) values ('aaaa'),('bbbb'),('cccc');

按照全文索引的使用语法执行下面查询

select * from test where match(content) against('a');
select * from test where match(content) against('aa');
select * from test where match(content) against('aaa');

根据我们的惯性思维,应该会显示 4 条记录才对,然而结果是 1 条记录也没有,只有在执行下面的查询时

select * from test where match(content) against('aaaa');

才会搜到 aaaa 这 1 条记录。

为什么?这个问题有很多原因,其中最常见的就是 最小搜索长度 导致的。另外插一句,使用全文索引时,测试表里至少要有 4 条以上的记录,否则,会出现意想不到的结果。

MySQL 中的全文索引,有两个变量,最小搜索长度和最大搜索长度,对于长度小于最小搜索长度和大于最大搜索长度的词语,都不会被索引。通俗点就是说,想对一个词语使用全文索引搜索,那么这个词语的长度必须在以上两个变量的区间内。

这两个的默认值可以使用以下命令查看

show variables like '%ft%';

可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

// MyISAM
ft_min_word_len = 4;
ft_max_word_len = 84;// InnoDB
innodb_ft_min_token_size = 3;
innodb_ft_max_token_size = 84;

可以看到最小搜索长度 MyISAM 引擎下默认是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只会对长度大于等于 4 或者 3 的词语建立索引,而刚刚搜索的只有 aaaa 的长度大于等于 4。

总结

MySQL 的全文索引最开始仅支持英语,因为英语的词与词之间有空格,使用空格作为分词的分隔符是很方便的。亚洲文字,比如汉语、日语、汉语等,是没有空格的,这就造成了一定的限制。不过 MySQL 5.7.6 开始,引入了一个 ngram 全文分析器来解决这个问题,并且对 MyISAM 和 InnoDB 引擎都有效。

事实上,MyISAM 存储引擎对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得 MyISAM 的全文索引对于很多的应用场景并不适合。所以,多数情况下的建议是使用别的解决方案,例如 Sphinx、Lucene 等等第三方的插件,亦或是使用 InnoDB 存储引擎的全文索引。

几个注意点

  1. 使用全文索引前,搞清楚版本支持情况;
  2. 全文索引比 like + % 快 N 倍,但是可能存在精度问题;
  3. 如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
  4. 对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。
  5. 全文索引是针对单词的,不能匹配其中的单个!也就是说如果你在"abcd,efg,hijklmn"中检索"hi",那么全文检索也没有用,如果你检索efg,那么可以使用全文检索
  6. 可以采用覆盖索引,主键来解决like左右%%模糊匹配问题!

参考文章:
https://blog.csdn.net/mrzhouxiaofei/article/details/79940958

MySQL全文索引和like相关推荐

  1. InnoDB MySQL 全文索引 学习笔记

    最近在学习MySQL全文索引的知识,基本搞清了功能以及使用方式,整理了相关资料分享出来一起学习进步哈 目录 1. 倒排索引 2. InnoDB全文检索 3. MySQL全文检索 3.1 Natural ...

  2. MySQL全文索引应用简明教程

    MySQL全文索引应用简明教程 本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 ...

  3. mysql全文索引含义_【分针网】MySQL全文索引应用简明教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本文从以下几个方面介绍下MySQL全文索引的基础知识:1.MySQL全文索引的几个注意事项2.全文索引的语法3.几种搜索类型的简介4.几种搜索类型的实例 ...

  4. mysql全文索引中文问题的解决(转)

    MySQL从3.23.23开始就逐渐支持全文索引和搜寻.  全文索引就是建index,全文搜寻就是去查index.  LIKE是用Regular Expression去做查询.  MySQL全文索引是 ...

  5. MySQL全文索引模糊查询_mysql全文索引之模糊查询

    旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息大家可以随时关注官网, ...

  6. mysql 全文索引 权重_MySQL中的全文索引

    之前曾经发表了一篇关于SQL Server全文索引的文章.现在将MySQL全文索引的配置过程记录一下. Step1:创建Student表 CREATE TABLE `student` ( `id` I ...

  7. laravel自动建mysql索引_让 Laravel 优雅地创建 MySQL 全文索引

    最近在浏览社区话题的时候,看到了一位同仁发表的一篇教程:Laravel 5.3 下通过 migrate 添加 "全文索引" 的方法,突然想到自己之前也研究过这一话题,所以今天就和大 ...

  8. mysql全文索引与停止词

    #mysql全文索引与停止词/*1.全文索引(FULLTEXT INDEX) FULLTEXT索引仅可用于MyISAM表,不可用于INNODB表 2.全文索引在mysql的默认情况下,对于中文意义不大 ...

  9. MYSQL全文索引及Match() against()踩坑记录-超详细超实用

    场景一 当我们使用mysql模糊查询时,经常会遇到如下情况: 如果我们customer_manager_no字段是可能会存多个值,用逗号隔开这种:当我们想查找出customer_manager_no字 ...

  10. Mysql全文索引性能测试对比

    在关系型数据库中,使用like模糊查询,如果是 'xxx%'头匹配方式,字段索引不会失效,性能能接受:但如果是 '%xxx%'全文匹配方式,索引会失效,在数据量大的情况下,通过此种方式查询的效率极低. ...

最新文章

  1. 试用JAVA的免费空间JHOST
  2. 【初探移动前端开发02】移动设备的页面
  3. Android Preference 须知
  4. 10.1.1 head标签
  5. (轉貼) Jolt 2007得獎名單 (News) (.NET)
  6. 在计算机系统中引入通道结构,第5-6章习题讲解.doc
  7. C语言和设计模式(备忘录模式)
  8. springboot14 整合JDBC
  9. CR, LF, CR/LF 回车 换行
  10. python中元组的赋值_在Python中,元组可以被赋值修改。( ) (2.0分)_学小易找答案...
  11. jdk1.8 64位 32位免费下载
  12. android zlib 和zip,gzip zip 和zlib
  13. librtmp linux下 编译,LibRtmp编译并导入Android Studio
  14. 一个简单todos的例子
  15. AI画图插画快捷做图
  16. Swagger:搭建Swagger API接口文档
  17. 183套免费简历模板,助大伙找个好工作
  18. Duplicate named routes definition
  19. 产品经理必备的13款效率工具
  20. Extmail实现邮件服务器

热门文章

  1. 【转】Knowledge-Distillation 知识蒸馏论文集合
  2. Sublime 设置中文方法
  3. 《Sre google运维解密》笔记
  4. 国际象棋 小麦 用java怎么算_蓝桥杯-放麦子-java
  5. c语言中问号和分号是什么,分号是什么符号
  6. 计算机专硕学硕哪个好考啊,【专硕考研】计算机考研选学硕还是专硕?
  7. 关于计算机方面英语ppt模板,经典ppt模板--计算机软件.ppt
  8. 如何判断某个类是否有某个注解?
  9. 手把手教你上架HarmonyOS(鸿蒙)应用
  10. 重装系统win10安装教程(超详细)