几个必须掌握的SQL优化技巧(五):Show Profile分析SQL性能

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。

1 前言


在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。


2 正文


前面有一篇文章:几个必须掌握的SQL优化技巧(三):Explain分析执行计划介绍了如何使用explain命令对sql的执行计划进行分析,具体的命令格式如下


explain + select语
复制代码


今天这篇文章将会介绍如何使用show profile命令来分析SQL性能和具体的时间耗费情况。


MySQL从5.0.37版本开始增加了对show profile和show profiles语句的支持,所以要想使用此功能,要确保版本在5.0.37之后。show profiles能够在做SQL优化时帮助我们了解SQL语句的性能耗费。


在MySQL数据库中,可以通过配置profiling参数来启用SQL剖析。该参数可以在全局和session级别来设置。对于全局级别则作用于整个MySQL实例,而session级别紧影响当前session。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory等等。根据这些开销进一步分析当前SQL瓶颈从而进行优化与调整。


通过have_profiling参数,能够看到当前MySQL是否支持profile:


6b09396d25564fcd9d76f01d99b3b53a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


默认profiling是关闭的,那么可以通过set语句在session级别开启profiling:


set profiling=1
复制代码


64149ff410a24a9b85dda5abeb779fa5~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


通过profile,能够清楚的了解SQL执行的过程。


比如输入show profiles命令后,我们可以看到各个sql语句执行的耗时:


1a743e59149a4773830ac290fdc4a798~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


queryid表示当前查询的id;query表示执行的sql操作;duration表示sql操作执行的时间耗费。


执行完上面的show profiles命令后,可以通过下面的命令来具体分析某个sql语句的时间具体耗费情况:


show profile for query query_id
复制代码


比如分析query_id为175的sql操作的具体情况:


show profile for query 175
复制代码


结果如下:


62b244359391480792986a157992be89~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


Status表示状态阶段,而Duration表示该状态阶段的耗时。


在获取了最小消耗时间的线程状态之后,mysql支持进一步选择all、cpu、block io、page faults等明细类型查看mysql在使用什么资源上耗费了过高的时间,如果输入:


show profile for all query query_id
复制代码


则可以展示所有的信息,部分如下:


47520fec835d41349a995a48e692981a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


也可以输入


show profile for 上面结果的某个具体字段 query query_id
比如
show profile for cpu query query_id
复制代码


查看详细的具体情况。


47520fec835d41349a995a48e692981a~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


3 总结


这篇文章主要介绍了show profiles和show profile命令来查看sql操作在各个阶段的具体耗时情况,从而方便我们进行后续的sql优化操作。


后面将会继续分享关于sql优化的其他方法、步骤。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
SQL 数据可视化 关系型数据库
MCP与PolarDB集成技术分析:降低SQL门槛与简化数据可视化流程的机制解析
阿里云PolarDB与MCP协议融合,打造“自然语言即分析”的新范式。通过云原生数据库与标准化AI接口协同,实现零代码、分钟级从数据到可视化洞察,打破技术壁垒,提升分析效率99%,推动企业数据能力普惠化。
562 3
|
6月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
276 0
|
11月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
10月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
1118 1
|
11月前
|
SQL 算法 数据挖掘
【SQL周周练】:利用行车轨迹分析犯罪分子作案地点
【SQL破案系列】第一篇: 如果监控摄像头拍下了很多车辆的行车轨迹,那么如何利用这些行车轨迹来分析车辆运行的特征,是不是能够分析出犯罪分子“踩点”的位置
292 15
|
12月前
|
SQL 关系型数据库 MySQL
【MySQL】SQL分析的几种方法
以上就是SQL分析的几种方法。需要注意的是,这些方法并不是孤立的,而是相互关联的。在实际的SQL分析中,我们通常需要结合使用这些方法,才能找出最佳的优化策略。同时,SQL分析也需要对数据库管理系统,数据,业务需求有深入的理解,这需要时间和经验的积累。
412 12
|
SQL 数据库管理 关系型数据库
使用sqlt手工创建sql_profile
在生产环境中有一些sql语句出现问题,大多是一些很紧急的问题,可能有些sql语句出现了执行计划的问题,通过hint能够做很大的改进,但是如果想让变更尽快生效,可以使用sql_profile来实现。
927 0
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
726 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
523 9