如何定位慢查询SQL以及优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 如何定位慢查询SQL以及优化

慢查询日志记录慢SQL


定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开

SET GLOBAL slow_query_log = ‘ON’;

ca5a435941b34b31ac9d3667f4b1796f.png

查看下慢查询日志配置

SHOW VARIABLES LIKE ‘slow_query_log%’


slow_query_log:表示慢查询开启的状态

slow_query_log_file:表示慢查询日志存放的位置


查看超过多少时间,才记录到慢查询日志

SHOW VARIABLES LIKE ‘long_query_time’


注意: 这样配置是临时的如果需要永久修改需要去配置文件(/etc/my.cnf


explain查看分析SQL执行计划


通过慢查询日志定位出查询效率较低的SQL,可以使用explain查看SQL的执行计划363d74d85a864fafb0c7dc973c65b02f.png

id

1. id 值相同时,被视为一组从上向下执行。

2. 如果是子查询,id 值会递增,id 值越高,优先级越高

3. id为NULL最后执行

select_type


1. simple: 简单的select, 查询中不包含子查询或者 union。例如: select name from student where id= 100

2. primary: 子查询中最外层查询, 查询中若包含任何复杂的子部分, 最外层的select被标记为primary

3. derived:在 from 的列表中包含的子查询被标记成 derived(派生表)。例如: explain select id from (select id,name from student) student1 where name= ‘name100’

4. subquery:在 select 或 where 列表中包含了子查询,则子查询被标记成 subquery。例如: explain select id from student where score = (select score from student where

name=‘name100’);

5. union: union中的第二个或后面的select语句. 例如: EXPLAIN select id from student where id<12691055 UNION all select id from student where id<12691060;


table


显示这一步所访问数据库中表名称. 有时候不是真实的表名, 可能是简称


partitions


该字段看table所在的分区, 值为NULL表示表未被分区


possible_keys


可能会使用到的索引(ps.其实不太重要)


重点关注的字段

type


表示连接类型,查看索引执行情况的一个重要指标 以下性能从好到坏依次:system > const > eq_ref > ref >

ref_or_null > index_merge > unique_subquery > index_subquery > range >

index > ALL

system:这种类型要求数据库表中只有一条数据,是const类型的一个特例,一般情况下是不会出现的

const:通过一次索引就能找到数据,一般用于主键或唯一索引作为条件,这类扫描效率极高,速度非常快

eq_ref:常用于主键或唯一索引扫描,一般指使用主键的关联查询 ref : 常用于非主键和唯一索引扫描

ref_or_null:这种连接类型类似于ref,区别在于MySQL会额外搜索包含NULL值的行

index_merge:使用了索引合并优化方法,查询使用了两个以上的索引

unique_subquery:类似于eq_ref,条件用了in子查询

index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值

range:常用于范围查询,比如:between … and 或 In 等操作 index:全索引扫描 ALL:全表扫描


key


实际使用到的索引


key_len


实际使用到的索引的长度


rows


该列表示MySQL估算找到我们所需的记录,需要读取的行数


filtered


该列是一个百分比,是满足条件的记录数量与我们查询了多少记录数量的比值


extra


该字段包含有关MySQL如何解析查询的其他信息,它一般会出现这几个值:

● Usingfilesort:表示按文件排序,一般是在指定的排序和索引排序不一致的情况才会出现,一般见于order by语句

● Using index:表示是否用了覆盖索引

● Using temporary: 表示是否使用了临时表,性能特别差,需要重点优化,一般多见于groupby语句,或者union语句

● Using where : 表示使用了where条件过滤

● Using index condition:MySQL5.6之后新增的索引下推,在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据减少回表的数据


profile分析执行耗时


explain只是看到SQL预估的执行计划,如果要了解SQL真正的执行线程状态及消耗的时间,需要使用profiling,开启profiling参数后,后续执行的SQL语句都会记录其资源开销,包括IO,上下文切换,CPU,内存等等,可以根据这些开销进一步分析当前慢SQL的瓶颈再进一步进行优化c556a8c892074bc08daf7cac58ba8d5f.png


Optimizer Trace分析详情


profile只能查看到SQL的执行耗时,但无法看到SQL真正执行的过程信息,不知道MySQL优化器是如何选择执行计划,这时候,可以使用Optimizer
Trace,它可以跟踪执行语句的解析优化执行的全过程

f1315716958849f9a15717c99201a7f0.png

三个阶段分为对应:准备阶段、分析阶段、执行阶段


确定问题采用响应措施


● 多数慢SQL都跟索引有关,比如不加索引,索引不生效、不合理等,这时候,可以优化索引

● 还可以优化SQL语句,比如一些in元素过多问题(分批),深分页问题(基于上一次数据过滤等),进行时间分段查询

● SQL没办法很好优化,可以改用ES的方式,或者数仓

● 如果单表数据量过大导致慢查询,可以考虑分库分表

● 如果数据库在刷脏页导致慢查询,考虑是否可以优化一些参数

● 如果存量数据量太大,考虑是否可以让部分数据归档


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 缓存 Java
sql优化方法
sql优化方法
22 0
|
3天前
|
SQL 存储 关系型数据库
一文搞懂SQL优化——如何高效添加数据
**SQL优化关键点:** 1. **批量插入**提高效率,一次性建议不超过500条。 2. **手动事务**减少开销,多条插入语句用一个事务。 3. **主键顺序插入**避免页分裂,提升性能。 4. **使用`LOAD DATA INFILE`**大批量导入快速。 5. **避免主键乱序**,减少不必要的磁盘操作。 6. **选择合适主键类型**,避免UUID或长主键导致的性能问题。 7. **避免主键修改**,保持索引稳定。 这些技巧能优化数据库操作,提升系统性能。
294 4
一文搞懂SQL优化——如何高效添加数据
|
3天前
|
SQL 关系型数据库 MySQL
项目中遇到一张900w的数据表把原先要花费17s执行的SQL优化到300ms经验加100哈哈哈
项目中遇到一张900w的数据表把原先要花费17s执行的SQL优化到300ms经验加100哈哈哈
25 1
|
3天前
|
SQL 存储 关系型数据库
【MySQL】SQL 优化
【MySQL】SQL 优化
20 0
|
3天前
|
SQL 缓存 关系型数据库
一次sql改写优化子查询的案例
在生产环境中,一个MySQL RDS实例遭遇了高CPU使用率问题,原因是执行了一条复杂的UPDATE SQL语句,该语句涉及一个无法缓存的子查询(UNCACHEABLE SUBQUERY),导致子查询需要针对每一行数据重复执行,极大地影响了性能。SQL语句的目标是更新一行数据,但执行时间长达30秒。优化方法是将子查询转换为内连接形式,优化后的语句执行时间降低到毫秒级别,显著减少了CPU消耗。通过示例数据和执行计划对比,展示了优化前后的时间差异和执行效率的提升。
|
3天前
|
存储 SQL 关系型数据库
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
|
3天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
233 3
|
3天前
|
存储 SQL 缓存
30个业务场景的SQL优化
这些优化策略和示例可以帮助改善 `SQL` 查询的性能和效率。在实践中,需要综合考虑数据库设计、`SQL` 编写、服务器配置等多方面因素,选择合适的优化方法,并进行充分的测试和验证。以上 30 个经验是 V 哥在实际经验中总结的内容,当然,业务场景不同,具体的优化策略也会不同,按实际情况处理,这不就是程序员要做的事情么。
|
3天前
|
SQL 存储 算法
clickhouse SQL优化
clickhouse 是 OLAP 数据库,但其具有独特的索引设计,所以如果拿 MySQL 或者其他 RDB 的优化经验来优化 clickhouse 可能得不到很好的效果,所以特此单独整理一篇文档,用于有 SQL 优化需求的同学,本人接触 clickhouse 时间也不长,难免有不足的地方,如果大家发现错误,还请不吝指正。
|
3天前
|
SQL 关系型数据库 MySQL
【MySQL】SQL优化
【MySQL】SQL优化