MySQL慢SQL优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 基础知识慢SQL官方定义If a query takes longer than this many seconds, the server increments the Slow_queries status variable. If the slow query log is enabled, the query is logged to the slow query log file; Unit:Second.阿里云控制台慢SQL参数SQL优化原因与影响•SQL优化原因:查询效率低的SQL(慢SQL)会占用机器大量的CPU、内存和IO资源,影响正常业务。

基础知识

慢SQL官方定义

If a query takes longer than this many seconds, the server increments the Slow_queries status variable. If the slow query log is enabled, the query is logged to the slow query log file; Unit:Second.

阿里云控制台慢SQL参数

image.png

SQL优化原因与影响

•SQL优化原因:查询效率低的SQL(慢SQL)会占用机器大量的CPU、内存和IO资源,影响正常业务。
•慢SQL现象/影响:SQL查询缓慢、业务超时、数据库机器CPU/IO飙升、业务连接不上数据库、现网故障等。

SQL语句执行过程

image.png

Optimizer查询优化器方式

逻辑优化

优化器的逻辑优化,即根据关系代数规则,对SQL语句进行等价变化:
(1) 对投影、选择等操作进行句式优化;
(2) 对条件表达式进行谓词优化、条件化简;
(3) 对连接语义进行外连接、嵌套连接的优化;
(4) 对集合、GROUP BY、ORDER BY等优化
(5) 子查询优化、视图重写、语义优化

逻辑优化例子

条件化简 :

select id,sfzh,address from t1 where 1=1 and name ='宸谦';

子查询优化 :

select * from t1 where a in (select a from t2);

优化器逻辑优化结果:

select t1.* from t1 join t2 on t1.a= t2.a;

 

物理优化

物理优化的总代价模型 Cost = CPU Cost + IO Cost
(1) CPU Cost:MySQL Server层,处理返回记录所花开销。
CPU Cost = records / TIME_FOR_COMPARE =
records / 5,即每5条记录的处理时间,作为 1 CPU Cost。
(2) IO Cost:存储引擎层面,读取页面的IO开销。

执行计划

查看

在SQL语句前加explain关键字可查看SQL语句的执行计划,
常用语法:
(1)explain extended(输出更多扩展信息)
(2)explain format=json (json格式输出,可看到cost等信息)
image.png

结果字段注解

image.png

案例分析

优化原则

优化总原则:业务侧优化 > SQL 优化 > 数据库+操作系统参数优化
SQL优化原则:高频SQL收益 > 低频SQL收益
业务侧优化例子:
(1)某业务每隔1分钟会并发几十路去数据库查询A表(全表扫描),造成其他业务响应超时
(2)统计分析类SQL拆分,热点数据缓存

慢SQL例子

SELECT
    count(*) count
FROM
    app_mst
LEFT JOIN app_profile ON app_mst.app_id = app_profile.app_id
LEFT JOIN app_apply_step ON app_mst.app_id = app_apply_step.app_id
WHERE
    app_apply_step.is_exp = '0';

执行计划:
image.png

优化步骤

(1)查看执行计划:
在SQL前加上 explain extended,主要关注key(用到什么索引)、rows(查询执行扫描的元组个数)、extra(是否利用到排序、临时表等)。
image.png
(2)查看SQL涉及的表结构,此处主要查看app_apply_step 表:
show create table app_apply_step, 主要关注表的索引和where 条件中的字段类型。可见 app_apply_step 表 is_exp 字段上无索引,且为tinyint类型。
image.png
(3)思考可能优化的点:
先查看表 app_apply_step 
字段is_exp的索引区分度 ,执行语句:
select count(distinct col1),
count(distinct col2)/count(*) from tb_name;
image.png

(4)is_exp 字段区分度约等于0,表明通过索引筛选非常高效。

alter table app_apply_step add index idx_is_exp (is_exp);
image.png

优化步骤总结

  1. 查看执行计划 explain extended
  2. 如果有告警信息,查看告警信息 show warnings;
  3. 查看SQL涉及的表结构和索引信息
  4. 根据执行计划,思考可能的优化点
  5. 按照可能的优化点执行表结构变更、增加索引、SQL改写等操作
  6. 查看优化后的执行时间和执行计划
  7. 如果优化效果不明显,重复第四步操作

慢SQL常见问题汇总

image.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
17天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
16天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
25天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
80 10
|
22天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
49 3
|
24天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
24天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
47 1
|
26天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
137 1
|
27天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
57 0
|
28天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
37 0
|
28天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
31 0