Mysql全文搜索对模糊查询的性能提升测试方式

 更新时间:2023年08月31日 10:16:25   作者:AbsoluteCuteness  
这篇文章主要介绍了Mysql全文搜索对模糊查询的性能提升测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

从测试成绩来看,使用mysql自带的全文搜索索引类型 FULLTEXT,20w数据,对比*like ‘%xxxx%’*双向模糊查询,查询效率提升了54.75倍,还是相当不错的;

场景:

最近工作中实现了一个通过字段名,提供映射工具给到客户,使客户得以通过可视化的字段规则自行拼装sql,实现数据筛选分析功能;我们这张表的字段数非常多,足有上百个;

分两个表的业务,一张表日表20w左右,另一张表日表200万左右;

因为sql规则是用户自定义的,一直没有做什么优化;

但是最近因为用户拼装出了超长sql,包含大量like查询以及and、or,最终导致查询跟不上,不得已考虑对他的优化。

本文讲述主要问题,大量的双模糊 like ‘%xxx%’优化

mysql中的全文索引介绍

MySQL 5.6开始支持全文索引,可以在变长的字符串类型上创建全文索引,来加速模糊匹配业务场景的DML操作。

它是一个inverted index(反向索引),创建fulltext index时会自动创建6个auxiliary index tables(辅助索引表),同时支持索引并行创建,并行度可以通过参数innodb_ft_sort_pll_degree设置,对于大表可以适当增加该参数值。

在MySQL5.6之前的版本中,只有 MyISAM 存储引擎支持全文索引,而且对中文搜索支持不是太好,需要自己进行分词后将段落预处理拆分成单词在入库。

MySQL5.7 开始才增加了对Inodb存储引擎的支持,并且有了内置的分词器 ngram。ngram 支持设置设置分词的长度,可以将中文按长度拆分为不同的单词(虽然不太智能,但满足大部分场景)。

-- 查询mysql版本
select version();
-- 8.0.23

测试部分

1、创建无测试字段索引的测试表,并导入20w数据,进行无索引状态下模糊查询耗时计算

-- 无索引状态下耗时
select * from yd_alarminfo_all_20220825 where alarmTitle like "%端口故障%"
-- 耗时:0.438秒

2、使用ngram分词,创建全文索引

alter table yd_alarminfo_all_20220825 add fulltext index idx_full_title(alarmTitle) with parser ngram;

3、再次查询

-- 无索引状态下耗时
select * from yd_alarminfo_all_20220825 WHERE MATCH (alarmTitle) against('端口故障' IN BOOLEAN MODE)
--耗时:0.008秒

使用过程中的其他问题 

1)关于参数微调

我在使用的时候并没有对配置参数做调整,根据官方文档的介绍。

全文搜索并没有提供很多的可供调整的参数,而且默认行为不管是对中文的分词都是满足的,大多数场景属于开箱即用,无需调整。

更多参考官方文档: 12.10.6 Fine-Tuning MySQL Full-Text Search

2)Natural Language 模式下

查询结果不太一样,匹配字符串“端口故障”被进行了再次分词;该模式为默认的查询模式,需要注意一下

MySQL全文检索模式主要有两种:

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

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

3)在MATCH … AGAINST(…) 中

有自己的 AND OR 语法,如果使用传统的AND、OR拼装,效率拉胯

-- 错误示例
select * from yd_alarminfo_all_20220825 WHERE MATCH (alarmTitle) against('网卡端口故障' IN BOOLEAN MODE) OR MATCH (alarmTitle) against('AAA' IN BOOLEAN MODE)
-- 正确示例
select * from yd_alarminfo_all_20220825 WHERE MATCH (alarmTitle) against('网卡端口故障 -AAA-' IN BOOLEAN MODE)

4)补充BOOLEAN MODE下的语法

示例:

MATCH (col1,col2,...) AGAINST (expr IN BOOLEAN MODE)
expr 语法示例:
	'apple banana'
	查找至少包含两个单词之一的行。
	'+apple +juice'
	查找包含这两个单词的行。
	'+apple macintosh'
	查找包含“apple”一词的行,但如果它们也包含“macintosh”,则排名更高。
	'+apple -macintosh'
	查找包含“apple”一词但不包含“macintosh”一词的行。
	'+apple ~macintosh'
	查找包含“apple”一词的行,但如果该行也包含“macintosh”一词,则将其评分低于行不包含。这比搜索'+apple -macintosh'“软”,因为“macintosh”的存在导致该行根本不返回。
	'+apple +(>turnover <strudel)'
	查找包含“apple”和“turnover”或“apple”和“strudel”(按任何顺序)的行,但排名“apple turnover”高于“apple strudel”。
	'apple*'
	查找包含“apple”、“apples”、“applesauce”或“applet”等单词的行。
	'"some words"'
	查找包含确切短语“一些单词”的行(例如,包含“一些智慧单词”但不包含“一些噪音单词”的行)。请注意,包含短语的"字符是划定短语的运算符字符。它们不是包围搜索字符串本身的引号。

结论部分

从测试成绩来看,使用mysql自带的全文搜索索引类型 FULLTEXT,20w数据,对比*like ‘%xxxx%’*双向模糊查询,查询效率提升了54.75倍,还是相当不错的;

关于mysql全文搜索更多的基础知识我就不再介绍了,主要是进行测试其有效性,还是令人满意的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

参考:

官方文档

Functions and Operators 》 Full-Text Search Functions

相关文章

  • mysql的json处理实现

    mysql的json处理实现

    本文主要介绍了mysql的json处理实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • MySQL外键约束的禁用与启用命令

    MySQL外键约束的禁用与启用命令

    下面小编就为大家带来一篇MySQL外键约束的禁用与启用命令。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL读取Binlog日志常见的3种错误

    MySQL读取Binlog日志常见的3种错误

    这篇文章主要介绍了MySQL读取Binlog日志常见的3种错误,非常不错,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-04-04
  • 从其他电脑访问本机的Mysql的设置方法

    从其他电脑访问本机的Mysql的设置方法

    如果需要让特定的用户从给定域(例如mydomain.com)的所有计算机上访问 MySQL 服务器,你可以执行在账户名的 host 部分使用了通配符“%” 的 GRANT 语句
    2008-11-11
  • 同时运行多个MySQL服务器的方法

    同时运行多个MySQL服务器的方法

    在同一台机器上运行多个有些情况下你可能想要在同一台机器上运行多个服务器。例如,你可能想要测试一个新的MySQL版本而让你现有生产系统的设置不受到干扰, 或你可能是想要为不同的客户提供独立的MySQL安装一个因特网服务供应商。
    2008-05-05
  • Linux下如何通过MySQL二进制包安装MySQL5.7

    Linux下如何通过MySQL二进制包安装MySQL5.7

    这篇文章主要介绍了Linux下如何通过MySQL二进制包安装MySQL5.7,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)

    mysql中批量插入数据(1万、10万、100万、1000万、1亿级别)

    本文主要介绍了mysql中批量插入数据(1万、10万、100万、1000万、1亿级别),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • MySQL常用慢查询分析工具详解

    MySQL常用慢查询分析工具详解

    这篇文章主要介绍了MySQL常用慢查询分析工具详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • mysql 获取当天发布的信息的语句

    mysql 获取当天发布的信息的语句

    mysql 获取当天发布的信息的实现语句,需要的朋友可以参考下。
    2010-03-03
  • mysql之TIMESTAMP(时间戳)用法详解

    mysql之TIMESTAMP(时间戳)用法详解

    这篇文章主要介绍了mysql之TIMESTAMP(时间戳)用法,需要的朋友可以参考下
    2014-07-07

最新评论