Mysql模糊查询优化方法及测试详细讲解

 更新时间:2023年05月15日 11:01:11   作者:AbsoluteCuteness  
这篇文章主要介绍了Mysql模糊查询优化方法及测试,在MySQL中支持模糊匹配的方法有很多,且各有各的优点,感兴趣想要详细了解可以参考下文

上文讲到了解决mysql 模糊查询的主要方法,还是使用全文索引,本文讲到其他相关的模糊插叙优化;同样进行耗时对比

结论:除了使用索引相关的方法,本文测试了网上其他的一些sql写法对模糊查询进行优化,其他的写法没有什么效果

无优化左前缀like

select * from yd_alarminfo_all_20220825 where alarmTitle like "网卡端口%"
--耗时:0.493

普通索引

-- 创建普通索引
ALTER table yd_alarminfo_all_20220825 add index idx_title(alarmTitle);
-- 查询耗时:0.003

效果:164倍效率提升

左前缀索引

左前缀索引就是在普通索引的基础上限定索引的长度,随着索引长度限制的越小,查询效率越差;左前缀索引的使用场景主要是:

  • 数据特征表现为数据左端就能够表现出较大的差异性,依据左侧的部分前缀,就能够有效进行数据过滤
  • 数据很长,为了节省索引的空间消耗

确定左前缀索引前缀长度的方法

  • 字段截取一定位数,计算于总数的去重后占比
  • 依据上一步结果制图,选择字段长度尽量少且索引选择性高的,性价比高的长度
select COUNT(DISTINCT LEFT(alarmTitle,3))/COUNT(*) as sel3,
	COUNT(DISTINCT LEFT(alarmTitle,5))/COUNT(*) as sel5,
	COUNT(DISTINCT LEFT(alarmTitle,7))/COUNT(*) as sel7,
	COUNT(DISTINCT LEFT(alarmTitle,9))/COUNT(*) as sel9,
	COUNT(DISTINCT LEFT(alarmTitle,11))/COUNT(*) as sel11,
	COUNT(DISTINCT LEFT(alarmTitle,13))/COUNT(*) as sel13,
	COUNT(DISTINCT LEFT(alarmTitle,15))/COUNT(*) as sel15,
	COUNT(DISTINCT LEFT(alarmTitle,17))/COUNT(*) as sel17,
	COUNT(DISTINCT LEFT(alarmTitle,19))/COUNT(*) as sel19,
	COUNT(DISTINCT LEFT(alarmTitle,21))/COUNT(*) as sel21
 from yd_alarminfo_all_20220825;

如图,选择度0.080之后,字段的增加,选择性增幅趋缓,选择0.080对应的长度

# 删除旧索引
DROP INDEX idx_title ON yd_alarminfo_all_20220825;
# 创建左前缀索引(索引创建语句只比普通索引多了‘(15)')
ALTER table yd_alarminfo_all_20220825 add index idx_title(alarmTitle(15));
-- 查询耗时:0.01
select * from yd_alarminfo_all_20220825 where alarmTitle like "网卡端口%'

效果:493倍效率提升

当查询结果的字符数小于左前缀长度时,左前缀可能甚者会有效率提升(理论上虽然索引选择性没有增加,但索引数少了);字符数大于前缀长度时,因索引选择性降低的部分,性能有所降低;整体上是降低的

右后缀索引

通常我们的数据一般是左侧相似度高,右侧相似度低,但是右后缀索引可能并没有很高的适用性;右后缀索引的方法是:

  • 通过触发器或生成列语法对过滤字段反转另存
  • 对反转后的新字段创建左前缀索引

右后缀索引创建了新的反转字段,这是需要空间消耗的,而前缀索引是为了降低空间消耗的;那么右后缀索引和普通索引的性价比就不好说了

此处测试略过…

非索引优化

LOCATE

-- 删除旧索引
DROP INDEX idx_title ON yd_alarminfo_all_20220825;
-- LOCATE
SELECT * FROM yd_alarminfo_all_20220825 WHERE LOCATE('网卡端口', alarmTitle)>0
-- 查询耗时:0.499

效果:没太大效果

POSITION

position能够看作是locate的别名,功能跟locate同样

SELECT * FROM yd_alarminfo_all_20220825 WHERE POSITION('网卡端口' IN alarmTitle)
--查询耗时:0.544

效果:没太大效果

INSTR

SELECT * FROM yd_alarminfo_all_20220825 WHERE INSTR(alarmTitle, '网卡端口' )>0
--查询耗时:0.566

效果:没太大效果

先查询字段值,再范围查询

效果:没什么效果

结论:除了使用索引相关的方法,本文测试了网上其他的一些sql写法对模糊查询进行优化,其他的写法没有什么效果

到此这篇关于Mysql模糊查询优化方法及测试详细讲解的文章就介绍到这了,更多相关Mysql模糊查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL存储过程未执行的问题排查过程

    MySQL存储过程未执行的问题排查过程

    文章讲述了对 MySQL 存储过程未执行的问题排查过程,先后排查了数据库版本升级、用户权限不足,最终发现是存储过程创建时的 SQL 模式导致,即使之后去掉该模式,存储过程内部仍沿用旧模式,重新创建存储过程后问题解决,需要的朋友可以参考下
    2025-02-02
  • MySQL子查询原理的深入分析

    MySQL子查询原理的深入分析

    子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入,下面这篇文章主要介绍了MySQL子查询原理的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Mysql exists用法小结

    Mysql exists用法小结

    这篇文章主要介绍了Mysql exists用法的的相关资料,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-12-12
  • 浅谈为什么Mysql数据库尽量避免NULL

    浅谈为什么Mysql数据库尽量避免NULL

    这篇文章主要介绍了浅谈为什么Mysql数据库尽量避免NULL,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL内连接和外连接及七种SQL JOINS的实现

    MySQL内连接和外连接及七种SQL JOINS的实现

    这篇文章主要介绍了Mysql内连接和外连接的区别以及七种SQL Joins的实现,相信看完这篇文章你对SQL内外连接的多表查询就足够理解了,需要的朋友可以参考下
    2023-03-03
  • MySql获取当前时间并转换成字符串的实现

    MySql获取当前时间并转换成字符串的实现

    本文主要介绍了MySql获取当前时间并转换成字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • MySQL select查询之LIKE与通配符用法

    MySQL select查询之LIKE与通配符用法

    这篇文章主要介绍了MySQL select查询之LIKE与通配符用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL 的覆盖索引与回表的使用方法

    MySQL 的覆盖索引与回表的使用方法

    这篇文章主要介绍了MySQL 的覆盖索引与回表的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 浅谈MySQL数据库表锁了怎么解锁

    浅谈MySQL数据库表锁了怎么解锁

    在使用 MySQL 数据库时,有时候会发生某个表被锁住的情况,这可能会导致其他用户无法对该表进行读写操作,影响系统的正常运行,本文主要介绍了浅谈MySQL数据库表锁了怎么解锁,感兴趣的可以了解一下
    2023-10-10
  • MySQL8.0设置远程访问权限的方法

    MySQL8.0设置远程访问权限的方法

    这篇文章主要介绍了MySQL8.0设置远程访问权限的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论