mysql全文索引使用
一、前言
在以前的博客中小编介绍过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会爆掉。
mysql全文索引使用相关推荐
- InnoDB MySQL 全文索引 学习笔记
最近在学习MySQL全文索引的知识,基本搞清了功能以及使用方式,整理了相关资料分享出来一起学习进步哈 目录 1. 倒排索引 2. InnoDB全文检索 3. MySQL全文检索 3.1 Natural ...
- MySQL全文索引应用简明教程
MySQL全文索引应用简明教程 本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 ...
- mysql全文索引含义_【分针网】MySQL全文索引应用简明教程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本文从以下几个方面介绍下MySQL全文索引的基础知识:1.MySQL全文索引的几个注意事项2.全文索引的语法3.几种搜索类型的简介4.几种搜索类型的实例 ...
- mysql全文索引中文问题的解决(转)
MySQL从3.23.23开始就逐渐支持全文索引和搜寻. 全文索引就是建index,全文搜寻就是去查index. LIKE是用Regular Expression去做查询. MySQL全文索引是 ...
- MySQL全文索引模糊查询_mysql全文索引之模糊查询
旧版的MySQL的全文索引只能用在MyISAM表格的char.varchar和text的字段上. 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息大家可以随时关注官网, ...
- mysql 全文索引 权重_MySQL中的全文索引
之前曾经发表了一篇关于SQL Server全文索引的文章.现在将MySQL全文索引的配置过程记录一下. Step1:创建Student表 CREATE TABLE `student` ( `id` I ...
- laravel自动建mysql索引_让 Laravel 优雅地创建 MySQL 全文索引
最近在浏览社区话题的时候,看到了一位同仁发表的一篇教程:Laravel 5.3 下通过 migrate 添加 "全文索引" 的方法,突然想到自己之前也研究过这一话题,所以今天就和大 ...
- mysql全文索引与停止词
#mysql全文索引与停止词/*1.全文索引(FULLTEXT INDEX) FULLTEXT索引仅可用于MyISAM表,不可用于INNODB表 2.全文索引在mysql的默认情况下,对于中文意义不大 ...
- MYSQL全文索引及Match() against()踩坑记录-超详细超实用
场景一 当我们使用mysql模糊查询时,经常会遇到如下情况: 如果我们customer_manager_no字段是可能会存多个值,用逗号隔开这种:当我们想查找出customer_manager_no字 ...
- Mysql全文索引性能测试对比
在关系型数据库中,使用like模糊查询,如果是 'xxx%'头匹配方式,字段索引不会失效,性能能接受:但如果是 '%xxx%'全文匹配方式,索引会失效,在数据量大的情况下,通过此种方式查询的效率极低. ...
最新文章
- 暴力拒绝白嫖,著名开源项目作者删库跑路!神秘Bug影响超2万个项目,亚马逊云也躺枪...
- android加载时二级联动点击二级联动,Android实现联动下拉框二级地市联动下拉框功能...
- EASYHOOK逆向寒假生涯(20/100)
- java内存优化详解_jvm堆内存优化详解
- scala 函数中嵌套函数_Scala中的嵌套函数 用法和示例
- oracle清除bin,Oracle recyclebin详解(闪回删除的表)
- MySQL学习笔记:SQL基本语法
- linux驱动编写(设备树)
- css 实现居中的五种方式
- 2017百度之星初赛:A-1006. 度度熊的01世界(DFS)
- 专业级频谱测试软件,手机频谱仪测试软件
- vue日历插件vue-calendar
- 山大商院java课程_山大商院必读书目推荐——《社会科学方法论》
- FreeSWITCH实现在视频通话中某一方视频翻转
- oracle vm virtualbox安装后会一直重启,并且installation destination显示磁盘不够,让重建分区
- 知乎周源:知识变现背后的信息逻辑
- 黑苹果10.15.7使用
- 腾讯全民wifi驱动 v1.1.923 官方版
- 逾期的人真有这么多吗?
- 全新UI众人帮任务帮PHP源码 悬赏任务抖音快手头条点赞源码 带三级分销可封装小程序