MySQL Like模糊查询速度太慢如何进行优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL Like模糊查询速度太慢如何进行优化

一、前言:

我建了一个《学生管理系统》,其中有一张学生表和四张表(小组表,班级表,标签表,城市表)进行联合的模糊查询,效率非常的低,就想了一下如何提高like模糊查询效率问题


注:看本篇博客之前请查看:Mysql中如何查看Sql语句的执行时间

二、第一个思路建索引

1、like %keyword 索引失效,使用全表扫描。


2、like keyword% 索引有效。


3、like %keyword% 索引失效,使用全表扫描。


使用explain测试了一下:


原始表(注:案例以学生表进行举例)

-- 用户表
create table t_users(
                        id int primary key auto_increment,
-- 用户名
                        username varchar(20),
-- 密码
                        password varchar(20),
-- 真实姓名
                        real_name varchar(50),
-- 性别 1表示男  0表示女
                        sex int,
-- 出生年月日
                        birth date,
-- 手机号
                        mobile varchar(11),
-- 上传后的头像路径
                        head_pic varchar(200)
);

建立索引

#create index 索引名 on 表名(列名);                 
create index username on t_users(username);

like %keyword% 索引失效,使用全表扫描

explain select id,username,password,real_name,sex,birth,mobile,head_pic 
 from t_users where username like '%h%';

image.png

like keyword% 索引有效。

 explain select id,username,password,real_name,sex,birth,mobile,head_pic 
 from t_users where username like 'wh%';

image.png


like %keyword 索引失效,使用全表扫描。


image.png

三、INSTR

这个我最开始都没听说过,今天查阅了一下资料,才知道有这个宝贝东西,


instr(str,substr):返回字符串str串中substr子串第一个出现的位置,没有找到字符串返回0,否则返回位置(从1开始)


#instr(str,substr)方法
select id,username,password,real_name,sex,birth,mobile,head_pic 
      from t_users  
      where instr(username,'wh')>0 #0.00081900
#模糊查询
select id,username,password,real_name,sex,birth,mobile,head_pic 
        from t_users 
        where username like 'whj'; # 0.00094650

image.png

image.png


比较两个效率差距不大主要原因是数据较少,最好多准备点原始数据进行测试效果最佳


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
算法 Java 调度
mybatis-plus中的雪花算法
主要介绍mybatis-plus中用到的雪花算法,如有错误或未考虑完全的地方,望不吝赐教。这里默认大家对雪花算法有一定的了解哈
6455 1
mybatis-plus中的雪花算法
|
9月前
|
存储 缓存 关系型数据库
MySQL的count()方法慢
MySQL的 `COUNT()`方法在处理大数据量时可能会变慢,主要原因包括数据量大、缺乏合适的索引、InnoDB引擎的设计以及复杂的查询条件。通过创建合适的索引、使用覆盖索引、缓存机制、分区表和预计算等优化方案,可以显著提高 `COUNT()`方法的执行效率,确保数据库查询性能的提升。
1214 12
|
10月前
|
搜索推荐 关系型数据库 MySQL
mysql like查询优化
通过合理的索引设计、使用全文索引、优化查询结构以及考虑分片和分区表,可以显著提高MySQL中 `LIKE`查询的性能。针对不同的应用场景选择合适的优化策略,能够有效地提升数据库查询效率,减少查询时间。希望这些方法和技巧能帮助您优化MySQL数据库中的模糊查询。
1065 4
|
12月前
|
搜索推荐 关系型数据库 MySQL
MySQL 模糊查询新纪元:超越 LIKE+% 的高效探索
在数据库的日常操作中,模糊查询是一项不可或缺的功能,它允许我们根据不完全匹配的关键字来检索数据。传统上,MySQL 使用 LIKE 关键字配合 % 通配符来实现这一功能,虽然灵活但性能上往往不尽如人意,尤其是在处理大型数据集时。今天,我们将一起探索几种超越 LIKE+% 的模糊查询技术,以提升查询效率与用户体验。
645 2
|
关系型数据库 MySQL 索引
mysql8.0中fulltext不能查询到中文的解决方法
确保MySQL服务器字符集为`utf8mb4`,并设置`ngram_token_size=1`以支持单字搜索。如已更改此参数且存在全文索引,需删除原有索引并重建,使用`WITH PARSER ngram`指定解析器。例如: ``` ALTER TABLE your_table DROP INDEX idx_fulltext, ADD FULLTEXT INDEX idx_fulltext (your_column) WITH PARSER ngram; ```
|
搜索推荐 关系型数据库 MySQL
不引入ES,如何利用MySQL实现模糊匹配?
【8月更文挑战第23天】在数据处理和查询优化的日常工作中,我们常常面临需要执行模糊匹配的场景,比如搜索用户姓名、商品标题等。虽然Elasticsearch(ES)等搜索引擎提供了高效且强大的文本搜索能力,但在某些轻量级或资源受限的环境中,直接利用MySQL数据库实现模糊匹配也是一个经济且可行的选择。下面,我将分享几种在MySQL中实现模糊匹配的技术方法。
622 0
|
SQL Java 关系型数据库
MySQL Like模糊查询速度太慢如何进行优化
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
789 0
MySQL Like模糊查询速度太慢如何进行优化
|
XML Java 数据库连接
解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
13827 2
解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题
|
Java easyexcel 应用服务中间件
【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据
【二十五】springboot使用EasyExcel和线程池实现多线程导入Excel数据
1344 0
|
SQL JavaScript 小程序
来了,MyBatisPlus的join联表查询!
来了,MyBatisPlus的join联表查询!
来了,MyBatisPlus的join联表查询!