项目场景:

最近在做性能优化,有使用到全文索引,做下记录。


问题描述

我们在做列表查询的时候,大多数情况都会遇到 like '%%'的查询,而这种查询会让索引失效
在数据量较大的时候,会让查询变得很慢,当然我们可以使用es去做优化,es的引入也会让代码变得复杂相对不使用来说,因此我们在没必要的时候就直接使用mysql就好了。



解决方案:

一、mysql 全文索引的限制,需要mysql版本在5.7及以上版本才支持,不知道版本的使用一下指令查看版本号。

select version();

二、建立索引sql如下

CREATE FULLTEXT INDEX idx_fullname ON t_course(name) WITH PARSER ngram;
CREATE FULLTEXT INDEX idx_fullname ON t_course_type(name) WITH PARSER ngram;

这里需要使用WITH PARSER ngram 适用于中文分词,如果要搜索的内容为英文,可以不加后面这段。
三、修改mysql配置如下,
在你的mysql安装目录下,找到该配置文件,D:\javaTools\mysql-8.0.12-winx64\my.ini,如果没有就自己新建一个。添加如下配置

innodb_ft_min_token_size = 1 #配置分词最小单位
ft_min_word_len = 1 #配置分词最小单位

修改完后需要重启才生效。
加这两个配置原因是要把粒度分到最小,如果不是,则有可能你搜,“你好”,内容含有 这两个字,你搜索不到,这两个值默认是4。所以要修改下。
重启完后使用指令查看配置是否生效

show variables like '%ft%';

四、使用全文索引搜索。

selecttc.id,tc.name
fromt_course tc
where
match(name) against ('测试') limit 5


可以看到测试相关的内容就查出来了,explain一下看看是否走索引。

可以看到是走了刚刚的全文索引。
五、多字段全文索引

CREATE FULLTEXT INDEX idx_fullname ON t_course(name,字段名) WITH PARSER ngram;
match(name,字段名) against ('测试')

像上面这样类似建立一个组合索引即可。
六、join查询两个表全文索引。
有一种情况是join查询,两个表都有字段要全文索引,这种情况经过测试,是不生效的,类似还有一个coursetype表name字段也全文索引。

explain selecttc.id,tc.name,tct.name,tct.id
fromt_course tc left join t_course_type tct  on tc.course_type =tct.id
where
1=1
and (
match(tc.name) against ('测试')
or match(tct.name) against ('测试')
)


这样子是不会走索引的,同时模糊搜索课程的名字和类型名字。这种情况只能另外想办法解决了,可以考虑 使用
(a left join b where match(a.name) ) union (a right join b math(b.name))
这种方式去实现,这样sql复杂度提升了不少,其实不建议这样子用,还不如直接放es算了。

总结

介绍了下如何使用全文索引,要注意的点已经上面都有写了,替大家走了坑总结实践出来的使用方案,大家如果有需要可以参考下。

mysql 全文索引使用以及限制相关推荐

  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. 关于perl中变量内插问题的讨论
  2. 《Ajax基础教程》一书推荐的JS工具备忘
  3. 只允许在数据框中输入身份证号的js函数
  4. spark(1.1) mllib 源代码分析
  5. 遗传算法实例-求解函数极值
  6. mamcache登录、_gomemcache首页、文档和下载 - memcache客户端库 - Go语言中文网 - Golang中文社区...
  7. Apache开启Gzip压缩设置(转)
  8. C#单元测试如何查看输出的调试信息?
  9. 云龙51单片机视频教程+课件+程序代码+课后作业,零基础入门视频教程
  10. 人力资源术语英汉对照(zt)
  11. 使用Wps切分单页PDF文件为多页pdf
  12. 易起秀登录不了 显示服务器,制作的易企秀作品为什么找不到了?
  13. 测试用例设计—场景分析法
  14. win10将HTML动态做桌面壁纸,Win10 怎么制作动态界面壁纸
  15. 利用python生成微信h5_Python + Appium 微信公众号 H5 页面自动化测试
  16. 【4022】有些KPI的完成,╮(╯▽╰)╭
  17. 为什么c语言中会引入ASCII,C语言中ASCII码是什么意思?
  18. 基于C#的服装店进销存管理系统设计与实现
  19. 效法羲和驭天马,志在长空牧群星
  20. 【包管理器】vcpkg

热门文章

  1. Java 创建文件,文件夹不存在时,如何创建
  2. OPPOa8计算机怎么变成科学,oppoa8怎么设置返回键 虚拟导航键和全面屏手势都可以...
  3. spring security2.x 切换用户
  4. 拼团模式为什么会这么火?最完整的解析思路
  5. 什么时候不该使用es6箭头函数 1
  6. python如何处理视频之moviepy
  7. responsebody text html,utf-8在responseBody中得编码方式
  8. html中遍历map的值,map遍历的几种方式是什么
  9. 第一代计算机只能使用机器语言进行程序设计,20173计算机基础习题综合.doc
  10. 其他手机怎么安装鸿蒙系统,国内其它的手机厂家不想安装鸿蒙吗?