mysql 全文索引使用以及限制

article/2025/11/4 21:21:27

项目场景:

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


问题描述

我们在做列表查询的时候,大多数情况都会遇到 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算了。

总结

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


http://chatgpt.dhexx.cn/article/dNKcSCT9.shtml

相关文章

Mysql全文索引解析

parser与N-gram Parser分词器选择 及 ft_min_word_len与innodb_ft_min_token_size的区分及界定 学习《高性能mysql(第三版)》这本书时,学到了全文索引这一张节,但作者当时使用的版本是MySQL 5.5,届时只有MyISAM引擎支…

全文索引原理介绍

一、总论 根据http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库。 所以在了解Lucene之前要费一番工夫了解一下全文检索。 那么什么叫做全文检索呢?这要从我们生活中的数据说起。 我们生活中的…

什么是全文索引,为什么要使用全文索引?

MySQL中什么是全文索引,为什么要使用全文索引? 1.全文索引在查找上方面其效率是普通模糊(like)查询的N倍2.MySQL 5.7.6 之后的版本innodb支持全文索引3.修改配置文件 my.ini 或者my.conf 增加以下配置innodb_ft_min_token_size …

MySQL全文索引怎么创建

mysql全文索引 很慢,速度不如like的百分之一 从explain开始说起吧,很显然第一个sql语句压根没用任何索引(key列内什么都没有)!第二个倒是用到索引,却是主键索引,并非你添加的fulltext索引! 接下来&#xff…

SQL Server 全文索引的应用

在公司项目中提出了一个需求: 搜索包含指定关键词的数据。得到这需求后,站在技术角度考虑第一时间就联想到使用SQL里面“like”查询语句。进一步分析需求后,发现“Like”查询满足不到实际的要求。 示例: ---------------------…

全文检索

本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得大家还是应该掌握一下,不说多精通,但是应该有所了解。在讲解之前,我们先来看一个案例,通过该案例引出全文检索技术——Lucene。…

mysql全文索引使用

一、前言 在以前的博客中小编介绍过mysql的执行流程,索引优化等。正好前一段时间项目有一个新的需求,就重新调研了一下mysql的全文索引,并对mysql的全文索引进行了压测,看看性能怎么样。以判断是否使用。——可想而知,…

MySQL使用全文索引(fulltext index) 及中文全文索引使用

全文索引介绍 ----------------------------------------------------------------------------------------------------------------------------- 1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的My…

索引和全文检索

目录 索引 全文检索 学习类容:索引和全文检索 索引 索引:对数据库中一列或多列的值进行排序的一种结构 作用:合理的使用索引可以加速检索表中的数据。 分类: 按键列个数区分:单列索引,多列索引。 按…

MySQL使用全文索引(fulltext index)

1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网, 1.1. 创建表的同时创建全文索引 CREATE TABLE article ( …

MySQL 全文索引

说到查询,日常中常用的baidu,cnbing ,google等之类的网站。关系型数据库中的全文索引应该也是从这些搜索引擎里摸索出来的。 全文索引介绍: 在数据库中常用的查询方式一般是 等价,范围方式。当然也有LIKE %的模糊查询&#xff0c…

MySQL索引系列:全文索引

什么是全文索引? 全文索引首先是 MySQL 的一种索引类型,也是搜索引擎的关键技术。 试想在1M大小的文件中搜索一个词,可能需要几秒,在100M的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销&am…

全文索引简介

全文索引技术就是将各种信息,文档中所有的文字序列都作为检索对象,找出包含检索词汇的信息或文档。 全文索引在数据库中一般是作为单独模块使用的,如MYSQL全文检索工具——Sphinx,一般全文索引模块需要配合数据库的存储方式进行处…

【MySQL】全文索引详解

文章目录 🍀全文索引概述 🍀全文索引的创建 🍀创建表时定义索引 🍀在已存在表上创建 🍀执行create语句 🍀执行ALTER TABLE语句 全文索引概述 全文索引主要对字符串类型建立基于分词的索引&#xff0c…

html怎么异步传数据,用jQuery实现异步通信(用json传值)方法步骤

jQuery是时下比较流行的一个js库,能够用简单的代码做出理想的效果,就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法,本人就用jquery实现上篇中用ajax实现异步通信的效果,感受一下jqu…

用jQuery实现异步通信(用json传值)具体思路

jQuery是时下比较流行的一个js库,能够用简单的代码做出理想的效果,就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法,本人就用jquery实现上篇中用ajax实现异步通信的效果,感受一下jqu…

jQuery的toggle

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!--引入jq框架--><script src"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script></head><body>…

12.jQuery技术

一、jQuery知识点总览。 css&#xff08;&#xff09;方法&#xff1a;//通过css&#xff08;&#xff09;方法获取样式值let backgroundcolor $("#one").css("backgroundColor");alert(backgroundcolor);//通过css&#xff08;&#xff09;方法设置id为…

jQuery

##jQuery基础 1.概念&#xff1a;一个JavaScript框架。简化JS开发 *jQuery是一个快速、简洁的JavaScript框架&#xff0c;是继Prototype之后又一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。 jQuery设计的宗旨是“write Less&#xf…

jQuery建立WebSocket连接

jQuery建立WebSocket连接&#xff0c;向服务端发送数据&#xff0c;实现WebSocket连接成功。 js代码如下&#xff1a; <script src"https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script><script type"text/javascript">…