iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySql常用查询优化策略有哪些
  • 720
分享到

MySql常用查询优化策略有哪些

mysql 2022-12-02 18:12:29 720人浏览 八月长安
摘要

本篇内容介绍了“Mysql常用查询优化策略有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查询优化可以

本篇内容介绍了“Mysql常用查询优化策略有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

查询优化

可以说,对于大多数系统来说,读多写少一定是常态,这就表示涉及到查询的sql是非常高频的操作;

前置准备,给一张测试表添加10万条数据

使用下面的存储过程给单表造一批数据,将表换成自己的就好了

create procedure addMyData()

	begin

		declare num int;
		set num =1;
		
		while num <= 100000 do
		
			insert into XXX_table values(
				replace(uuid(),'-',''),concat('测试',num),concat('cs',num),'123456'
			);
 
			set num =num +1;
		end while;

	end ;

然后调用该存储过程

call addMyData();

本篇准备了3张表,分别为学生(student)表,班级(class)表,账户(account)表,各自有50万,1万和10万条数据用于测试;

MySql常用查询优化策略有哪些

MySql常用查询优化策略有哪些

1、分页查询优化

分页查询是开发中经常会遇到的,有一种情况是,当分页的数量非常大的时候,查询的时候往往非常耗时,比如查询student表,使用下面的sql查询,耗时达到0.2秒;

MySql常用查询优化策略有哪些

实践经验告诉我们,越往后,分页查询效率越低,这就是分页查询的问题所在, 因为,当在进行分页查询时,如果执行  limit 400000,10  ,此时需要 mysql 排序前4000 10  记 录,仅仅返回400000 - 4 00010 的记录,其他记录丢弃,查询排序的代价非常大

优化思路:

一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化;  

1) 在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其他列内容

SELECT * FROM student t1,(SELECT id FROM student ORDER BY id LIMIT 400000,10) t2 WHERE t1.id =t2.id;

执行上面的sql,可以看到响应时间有一定的提升;

MySql常用查询优化策略有哪些

2)对于主键自增的表,可以把Limit 查询转换成某个位置的查询

select * from student where id > 400000 limit 10;

执行上面的sql,可以看到响应时间有一定的提升;

MySql常用查询优化策略有哪些

2、关联查询优化

在实际的业务开发过程中,关联查询可以说随处可见,关联查询的优化核心思路是,最好为关联查询的字段添加索引,这是关键,具体到不同的场景,还需要具体分析,这个跟mysql的引擎在执行优化策略的方案选择时有一定关系;

2.1 左连接或右连接

下面是一个使用left join 的查询,可以预想到这条sql查询的结果集非常大

select t.* from student t left join class cs on t.classId = cs.id;

登录后复制

为了检查下sql的执行效率,使用explain做一下分析,可以看到,第一张表即left join左边的表student走了全表扫描,而class表走了主键索引,尽管结果集较大,还是走了索引;

MySql常用查询优化策略有哪些

针对这种场景的查询,思路如下:

  • 让查询的字段尽量包含在主键索引或者覆盖索引中;

  • 查询的时候尽量使用分页查询;

MySql常用查询优化策略有哪些

关于左连接(右连接)的explain结果补充说明

  • 左连接左边的表一般为驱动表,右边的表为被驱动表;

  • 尽可能让数据集小的表作为驱动表,减少mysql内部循环的次数;

  • 两表关联时,explain结果展示中,第一栏一般为驱动表;

2.2 关联查询关联的字段建立索引

看下面的这条sql,其关联字段非表的主键,而是普通的字段;

explain select u.* from tenant t left join `user` u on u.account = t.tenant_name where t.removed is null and u.removed is null;

登录后复制

MySql常用查询优化策略有哪些

通过explain分析可以发现,左边的表走了全表扫描,可以考虑给左边的表的tenant_name和user表的account 各自创建索引;

create index idx_name on tenant(tenant_name);

create index idx_account on `user`(account);

再次使用explain分析结果如下

MySql常用查询优化策略有哪些

可以看到第二行type变为ref,rows的数量优化比较明显。这是由左连接特性决定的,LEFT JOIN条件用于确定如何从右表搜索行,左边一定都有,所以右边是我们的关键点,一定需要建立索引 。

2.3 内连接关联的字段建立索引

我们知道,左连接和右连接查询的数据分别是完全包含左表数据,完全包含右表数据,而内连接(inner join 或join) 则是取交集(共有的部分),在这种情况下,驱动表的选择是由mysql优化器自动选择的;

在上面的基础上,首先移除两张表的索引

ALTER TABLE `user` DROP INDEX idx_account;
ALTER TABLE `tenant` DROP INDEX idx_name;

使用explain语句进行分析

MySql常用查询优化策略有哪些

然后给user表的account字段添加索引,再次执行explain我们发现,user表竟然被当作是被驱动表了;

MySql常用查询优化策略有哪些

此时,如果我们给tenant表的tenant_name加索引,并移除user表的account索引,得出的结果竟然都没有走索引,再次说明,使用内连接的情况下,查询优化器将会根据自己的判断进行选择;

MySql常用查询优化策略有哪些

3、子查询优化

子查询在日常编写业务的SQL时也是使用非常频繁的做法,不是说子查询不能用,而是当数据量超出一定的范围之后,子查询的性能下降是很明显的,关于这一点,本人在日常工作中深有体会;

比如下面这条sql,由于student表数据量较大,执行起来耗时非常长,可以看到耗费了将近3秒;

select st.* from student st where st.classId in (
	
	select id from class where id > 100

);

登录后复制

MySql常用查询优化策略有哪些

通过执行explain进行分析得知,内层查询 id > 100的子查询尽管用上了主键索引,但是由于结果集太大,带入到外层查询,即作为in的条件时,查询优化器还是走了全表扫描;

MySql常用查询优化策略有哪些

针对上面的情况,可以考虑下面的优化方式

select st.id from student st join class cl on st.classId = cl.id where cl.id > 100;

子查询性能低效的原因

  • 子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表 ,然后外层查询语句从临时表中查询记录,查询完毕后,再撤销这些临时表 。这样会消耗过多的CPU和io资源,产生大量的慢查询;

  • 子查询结果集存储的临时表,不论是内存临时表还是磁盘临时表都不能走索引 ,所以查询性能会受到一定的影响;

  • 对于返回结果集比较大的子查询,其对查询性能的影响也就越大;

使用mysql查询时,可以使用连接(JOIN)查询来替代子查询。连接查询不需要建立临时表 ,其速度比子查询要快 ,如果查询中使用索引的话,性能就会更好,尽量不要使用NOT IN 或者 NOT EXISTS,用LEFT JOIN xxx ON xx WHERE xx IS NULL替代;

一个真实的案例

在下面的这段sql中,优化前使用的是子查询,在一次生产问题的性能分析中,发现某个tenant_id下的数据达到了35万多,这样直接导致某个列表页面的接口查询耗时达到了5秒左右;

MySql常用查询优化策略有哪些

找到了问题的根源后,尝试使用上面的优化思路进行解决即可,优化后的sql大概如下,

MySql常用查询优化策略有哪些

4、排序(order by)优化

在mysql,排序主要有两种方式

  • Using filesort : 通过表索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort
    buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序;

  • Using index : 通过有序的索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高;

对于以上两种排序方式,Using index的性能高,而Using filesort的性能低,我们在优化排序操作时,尽量要优化为 Using index

4.1 使用age字段进行排序

由于age字段未加索引,查询结果按照age排序的时候发现使用了filesort,排序性能较低;

MySql常用查询优化策略有哪些

给age字段添加索引,再次使用order by时就走了索引;

MySql常用查询优化策略有哪些

4.2 使用多字段进行排序

通常在实际业务中,参与排序的字段往往不只一个,这时候,就可以对参与排序的多个字段创建联合索引;

如下根据stuno和age排序

MySql常用查询优化策略有哪些

给stuno和age添加联合索引

create index idx_stuno_age on `student`(stuno,age);

再次分析时结果如下,此时排序走了索引

MySql常用查询优化策略有哪些

关于多字段排序时的注意事项

1)排序时,需要满足最左前缀法则,否则也会出现 filesort;

在上面我们创建的联合索引顺序是stuno和age,即stuno在前面,而age在后,如果查询的时候调换排序顺序会怎样呢?通过分析结果发现,走了filesort;

MySql常用查询优化策略有哪些

2)排序时,排序的类型保持一致

在保持字段排序顺序不变时,默认情况下,如果都按照升序或者降序时,order by可以使用index,如果一个是升序,另一个是降序会如何呢?分析发现,这种情况下也会走filesort;

MySql常用查询优化策略有哪些

5、分组(group by)优化

group by 的优化策略和order by 的优化策略非常像,主要列举如下几个要点:

  • group by 即使没有过滤条件用到索引,也可以直接使用索引;

  • group by 先排序再分组,遵照索引建的最佳左前缀法则;

  • 当无法使用索引列时,增大 max_length_for_sort_data 和 sort_buffer_size 参数的设置;

  • where效率高于having,能写在where限定的条件就不要写在having中了;

  • 减少使用order by,能不排序就不排序,或将排序放到程序去做。Order by、groupby、distinct这些语句较为耗费CPU,数据库的CPU资源是极其宝贵的;

  • 如果sql包含了order by、group by、distinct这些查询的语句,where条件过滤出来的结果集请保持在1000行以内,否则SQL会很慢;

5.1 给group by的字段添加索引

如果字段未加索引,分析结果如下,这种结果性能显然很低效

MySql常用查询优化策略有哪些

给stuno添加索引之后

MySql常用查询优化策略有哪些

给stuno和age添加联合索引

MySql常用查询优化策略有哪些

如果不遵循最佳左前缀,group by 性能将会比较低效

MySql常用查询优化策略有哪些

遵循最佳左前缀的情况如下

MySql常用查询优化策略有哪些

6、count 优化

count() 是一个聚合函数,对于返回的结果集,一行行判断,如果 count 函数的参数不是NULL,累计值就加 1,否则不加,最后返回累计值;

用法:count(*)、count(主键)、count(字段)、count(数字)

如下列举了count的几种写法的详细说明

用法说明
count(主键)InnoDB 会遍历整张表,把每一行的主键id值都取出来,返回给服务层,服务层拿到主键后,直接按行进行累加(主键不可能为null);
count(*)InnoDB不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加;
count(字段)没有not null 约束 : InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加,有not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加;
count(数字)InnoDB 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加;

经验值总结

按照效率排序来看,count(字段) < count(主键 id) < count(1) ≈ count(*),所以尽量使用 count(*)

“MySql常用查询优化策略有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySql常用查询优化策略有哪些

本文链接: https://www.lsjlt.com/news/173902.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySql常用查询优化策略有哪些
    本篇内容介绍了“MySql常用查询优化策略有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!查询优化可以...
    99+
    2022-12-02
    mysql
  • 【MySql】mysql 常用查询优化策略详解
    前言 在程序上线运行一段时间后,一旦数据量上去了,或多或少会感觉到系统出现延迟、卡顿等现象,出现这种问题,就需要程序员或架构师进行系统调优工作了,其中,大量的实践经验表明,调优的手段尽管有很多,但涉及到SQL调优的内容仍然是非常重要的一环,...
    99+
    2023-08-31
    mysql 查询优化 mysql 关联查询优化 mysql查询优化总结
  • MySQL中有哪些优化策略
    MySQL中有哪些优化策略,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。单表优化除非单表数据未来会一直不断上涨,否则不要一开始...
    99+
    2022-10-18
  • MySQL数据库查询性能优化策略
    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。 通过对查询语句的分析,可以了解查询语句的执行情况,找出查询...
    99+
    2022-05-25
    MySQL 优化 MySQL 查询优化 MySQL 查询性能优化
  • cdn优化策略有哪些
    cdn优化策略有:cdn边缘节点缓存策略因服务商不同而不同,但都遵循http标准协议,通过http响应头中 Cache-control: max-age的字段来设置cdn边缘节点数据缓存时间。开发者可以通过cdn服务商提供的“刷新缓存”接口...
    99+
    2022-10-23
  • 网站优化策略有哪些
    这篇文章主要介绍“网站优化策略有哪些”,在日常操作中,相信很多人在网站优化策略有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”网站优化策略有哪些”的疑惑有所帮助!接下来,...
    99+
    2022-10-19
  • MySQL高性能索引策略和查询性能优化
    前缀索引和索引选择性 有时候需要索引很长的字符,这会让索引变得大且慢。一个策略是模拟哈希索引。 通常可以索引开始的部分字符,这样可以大大解约索引空间,提高索引效率。但这样会降低索引的选择性。 索引的选择性:不重复的索引值(也成为基数)和...
    99+
    2017-05-17
    MySQL高性能索引策略和查询性能优化
  • vue中加载优化策略有哪些
    这篇文章主要介绍了vue中加载优化策略有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一 路由懒加载首屏加载慢的原因无非就是单页面应...
    99+
    2022-10-19
  • 云服务器成本优化策略有哪些
    一、选择合适的云服务器供应商 在选择云服务器供应商时,需要考虑以下几个因素: 供应商的规模和实力 选择规模和实力较大的云服务器供应商,能够提供更全面、更稳定、更可靠的云服务器服务,从而更好地满足企业的需求。 供应商的服务质量 云服...
    99+
    2023-10-28
    成本 策略 服务器
  • SQL语句性能优化的策略有哪些
    这篇文章主要介绍“SQL语句性能优化的策略有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SQL语句性能优化的策略有哪些”文章能帮助大家解决问题。52 条 SQL 语句性能优化策略:对查询进行优...
    99+
    2023-06-28
  • MySQL中常用的查询子句有哪些
    这篇文章给大家分享的是有关MySQL中常用的查询子句有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对于数据分析,MySQL多采用查询,如数据的排序、分组、去重、汇总、字符串...
    99+
    2022-10-19
  • mysql语句中order by的查询速度太慢 请问需要做出哪些优化策略来提升查询速度...
    如果在MySQL中使用order by语句导致查询速度过慢,可以考虑以下优化策略: 使用索引:为排序字段建立索引可以提高查询速度。 增加内存:如果服务器内存不足,MySQL可能需要使用临时表或磁盘排序,增加内存可以避免这种情况。 减少数...
    99+
    2023-09-05
    mysql 数据库 sql
  • ASP存储API的负载优化策略有哪些?
    随着互联网的不断发展,Web应用程序的使用量不断增长,因此需要更高效的存储API来支持这些应用程序。ASP存储API是一种流行的存储API,可以帮助Web应用程序实现数据持久化。然而,随着数据规模的不断增加,存储API的负载也会越来越大,...
    99+
    2023-07-29
    存储 api load
  • MySQL结构化查询语言有哪些
    这篇文章主要介绍“MySQL结构化查询语言有哪些”,在日常操作中,相信很多人在MySQL结构化查询语言有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL结构化查询语言有哪些”的疑惑有所帮助!接下来...
    99+
    2023-06-02
  • JPA Specification常用查询有哪些
    这篇文章主要讲解了“JPA Specification常用查询有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JPA Specification常用查询有哪些”吧!JPA Specifi...
    99+
    2023-06-25
  • MySQL条件查询语句常用操作有哪些
    这篇文章主要介绍“MySQL条件查询语句常用操作有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL条件查询语句常用操作有哪些”文章能帮助大家解决问题。顾名思义, 条件查询就是使用wher...
    99+
    2023-06-30
  • nodejs Sequelize和mysql有哪些常用的查询命令
    下面讲讲关于nodejs Sequelize和mysql有哪些常用的查询命令,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完nodejs Sequelize和mysql有哪些常用...
    99+
    2022-10-18
  • MySql有哪些常用的查询时间段方法
    这篇文章主要介绍“MySql有哪些常用的查询时间段方法”,在日常操作中,相信很多人在MySql有哪些常用的查询时间段方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySq...
    99+
    2022-10-18
  • 有哪些常用的MySQL优化方法
    下面讲讲关于有哪些常用的MySQL优化方法,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完有哪些常用的MySQL优化方法这篇文章你一定会有所受益。    &n...
    99+
    2022-10-18
  • 网站优化过程中不同阶段的seo优化策略有哪些
    这篇文章主要介绍了网站优化过程中不同阶段的seo优化策略有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在网站的优化过程中,每个阶段都有每个阶段的优化策略,因为着重点不同...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作