mysql全文索引使用

article/2025/11/4 21:25:30

一、前言

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

      更多请看:

      【MySql】Sql优化(一)——Sql执行流程

      【MySql】Sql优化(二)——影响性能的因素

      【MySql】Sql优化(三)——性能优化

二、什么是全文检索

全文索引

      在前面的几篇博客中,小编提到过,mysql中常用的表的引擎有MyIsam 和 Innodb, 其中,默认存储引擎InnoDB,MYSQL5.6以前是不支持全文索引,新版本MYSQL5.6的InnoDB支持全文索引。MyIsam是支持索引的,但是不支持事务。只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

      随着Mysql的升级,我们使用众多的还是Innodb。

      要说清楚全文索引,可以举一个例子,比如现在有一个字段,内容是 德玛西亚万岁,这个时候有以下的需求:

1.查询带有 德玛 的内容
2.查询带有 万岁 的内容
3.查询带有 德玛西亚 的内容

      按照我们大体的思路来,我们会使用 select * from table where content like '%XXXX%' 来查询。使用like的缺点是,如果不是前缀索引,索引会失效。所以如果根据不同的内容来查的时候,自然很难命中索引。这样全文检索就登场。

      mysql会自动为我们切词,从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。性能怎么样呢?我们在后面进行测试。

ngram全文解析器

      ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“生日快乐”进行分词:

n=1: '生', '日', '快', '乐' 
n=2: '生日', '日快', '快乐' 
n=3: '生日快', '日快乐' 
n=4: '生日快乐'

      MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。

      全局变量ngram_token_size的两种设置方法:

1、启动mysqld命令时

mysqld --ngram_token_size=2

2、修改MySQL配置文件

[mysqld] 
ngram_token_size=2

创建全文索引

1、创建表的同时创建全文索引

CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR (200),body TEXT,FULLTEXT (title, body) WITH PARSER ngram
) ENGINE = INNODB;

2、通过 alter table 的方式来添加

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

3、直接通过create index的方式

CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;

全文检索模式
常用的全文检索模式有两种:

1、自然语言模式(NATURAL LANGUAGE MODE) ,
自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。

2、BOOLEAN模式(BOOLEAN MODE)
BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。

      示例

SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);// 不指定模式,默认使用自然语言模式
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带');

      上面的示例返回结果会自动按照相关性排序,相关性高的在前面。相关性的值是一个非负浮点数,0表示无相关性。

// 获取相关性的值
SELECT id,title,
MATCH (title,body) AGAINST ('手机' IN NATURAL LANGUAGE MODE) AS score
FROM articles
ORDER BY score DESC;

在这里插入图片描述

// 获取匹配结果记录数
SELECT COUNT(*) FROM articles
WHERE MATCH (title,body)
AGAINST ('一路 一带' IN NATURAL LANGUAGE MODE);

      可以使用BOOLEAN模式执行高级查询。

// 必须包含"腾讯"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+腾讯' IN BOOLEAN MODE);

在这里插入图片描述

// 必须包含"腾讯",但是不能包含"通讯工具"
SELECT * FROM articles
WHERE MATCH (title,body)
AGAINST ('+腾讯 -通讯工具' IN BOOLEAN MODE);

在这里插入图片描述

      下面的例子演示了BOOLEAN模式下运算符的使用方式:

'apple banana' 
无操作符,表示或,要么包含apple,要么包含banana'+apple +juice'
必须同时包含两个词'+apple macintosh'
必须包含apple,但是如果也包含macintosh的话,相关性会更高。'+apple -macintosh'
必须包含apple,同时不能包含macintosh。'+apple ~macintosh'
必须包含apple,但是如果也包含macintosh的话,相关性要比不包含macintosh的记录低。'+apple +(>juice <pie)'
查询必须包含apple和juice或者apple和pie的记录,但是apple juice的相关性要比apple pie高。'apple*'
查询包含以apple开头的单词的记录,如apple、apples、applet。'"some words"'
使用双引号把要搜素的词括起来,效果类似于like '%some words%',
例如“some words of wisdom”会被匹配到,而“some noise words”就不会被匹配。

      注意

  • 只能在类型为CHAR、VARCHAR或者TEXT的字段上创建全文索引。

  • 全文索引只支持InnoDB和MyISAM引擎。

  • MATCH (columnName) AGAINST (‘keywords’)。MATCH()函数使用的字段名,必须要与创建全文索引时指定的字段名一致。如上面的示例,MATCH (title,body)使用的字段名与全文索引ft_articles(title,body)定义的字段名一致。如果要对title或者body字段分别进行查询,就需要在title和body字段上分别创建新的全文索引。

  • MATCH()函数使用的字段名只能是同一个表的字段,因为全文索引不能够跨多个表进行检索。

  • 如果要导入大数据集,使用先导入数据再在表上创建全文索引的方式要比先在表上创建全文索引再导入数据的方式快很多,所以全文索引是很影响TPS的。

三、压测

      mysql全文索引查询 直接查询

      单表50w数据, 查三个字段 title subtitle body

      5个并发

      服务器
在这里插入图片描述

在这里插入图片描述

      Rds

      cpu一直飙升

在这里插入图片描述

四、小结

      mysql全文索引查询 ,虽然mysql在innodb上支持了全文索引,但是还是不推荐 ,并发高的时候 Rds 的cpu会爆掉。


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

相关文章

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

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

索引和全文检索

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

MySQL使用全文索引(fulltext index)

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

MySQL 全文索引

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

MySQL索引系列:全文索引

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

全文索引简介

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

【MySQL】全文索引详解

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

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

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

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

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

WebGoat攻略 for Mac(1)

WebGoat攻略 for Mac&#xff08;1&#xff09; 一、环境配置1.配置Docker2.配置WebGoat3.连接WebGoat 二、题目攻略Introduction(介绍)a.WebGoatb.WebWolf General(通用)a.HTTP Basics(HTTP基础)b.HTTP Proxies配置OWASP ZAP c.Developer Tools(开发人员工具)d.CIA Triade.Cry…

代码审计之WEBGOAT 反序列化

反序列化这关在前端页面可以看到是提交token到后端&#xff0c;先看一下接口名 可以看到接口名为InsecureDeserialization/task&#xff0c;那就后端全局搜索InsecureDeserialization/task&#xff0c;最终定位到InsecureDeserializationTask.java 源码如下&#xff1a; packa…

kali搭建webgoat靶场

下载webgoat-server-8.0.0.M26.jar与webwolf-server-8.0.0.M26.jar&#xff0c;并保存至kali的documents处&#xff0c;并在此打开终端&#xff08;不然无法打开&#xff09; 打开webgoat-server-8.0.0.M26.jar 浏览器访问127.0.0.1:8080/WebGoat/login.html 进行注册且登录 成…

基于 WebGoat 平台的 SQL 注入攻击

基于 WebGoat 平台的 SQL 注入攻击 扩展功能参考: https://blog.csdn.net/HZC0217/article/details/126790211 使用实例参考: https://www.cnblogs.com/hndreamer/p/16635984.html 目录 1、什么是 webgoat? 2、jar 下载 3、环境搭建 4、运行 webgoat 5、在浏览器中登录 …

owaspbwa之WebGoat

简介 下载&#xff1a;https://sourceforge.net/projects/owaspbwa/files/ GitHub: https://github.com/chuckfw/owaspbwa/wiki/UserGuide 0x001 侦查 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.3p1 Debian 3ubuntu4 (Ubuntu Linux; protoc…

WebGoat之JWT部分攻略

环境搭建 使用docker容器搭建webgoat环境 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;单点登录SSO&#xff1a;在多个应用系统中&…

Webgoat靶场搭建

环境 jdk16 安装 文件源码看评论区哈。 下载过后是这个jdk-16.0.2.7z文件&#xff0c;这是个JDK16的包,进入bin目录下&#xff0c;可以看到靶场文件&#xff0c; 启动网站 打开一个cmd窗口执行启动网站命令 java --add-opens java.base/sun.nio.chALL-UNNAMED --add-op…