mysql慢sql优化_MySQL慢SQL优化-阿里云开发者社区

基础知识

慢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参数

44d8284fe973a698fb620713167de427.png

SQL优化原因与影响

•SQL优化原因:查询效率低的SQL(慢SQL)会占用机器大量的CPU、内存和IO资源,影响正常业务。

•慢SQL现象/影响:SQL查询缓慢、业务超时、数据库机器CPU/IO飙升、业务连接不上数据库、现网故障等。

SQL语句执行过程

588b5a84eb83b564db263169914a52bc.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等信息)

01aa52e0fb36efbcae4af49a90367ce5.png

结果字段注解

a3a34e96bd1e9fe5e4cc91b730f090e8.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';

执行计划:

41d24ef6ce96c4c46aecd2f832ed6268.png

优化步骤

(1)查看执行计划:

在SQL前加上 explain extended,主要关注key(用到什么索引)、rows(查询执行扫描的元组个数)、extra(是否利用到排序、临时表等)。

85872286623e73a9805c8b7b0d4f054a.png

(2)查看SQL涉及的表结构,此处主要查看app_apply_step 表:

show create table app_apply_step, 主要关注表的索引和where 条件中的字段类型。可见 app_apply_step 表 is_exp 字段上无索引,且为tinyint类型。

d93ddfd4a003f78e6e2947a3e6c56dd4.png

(3)思考可能优化的点:

先查看表 app_apply_step

字段is_exp的索引区分度 ,执行语句:

select count(distinct col1),

count(distinct col2)/count(*) from tb_name;

961bd8349eefdc08962ca07d51726a68.png

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

alter table app_apply_step add index idx_is_exp (is_exp);

4d2bb3777567e0325c0a55d9efadffaa.png

优化步骤总结

查看执行计划 explain extended

如果有告警信息,查看告警信息 show warnings;

查看SQL涉及的表结构和索引信息

根据执行计划,思考可能的优化点

按照可能的优化点执行表结构变更、增加索引、SQL改写等操作

查看优化后的执行时间和执行计划

如果优化效果不明显,重复第四步操作

慢SQL常见问题汇总

772f1205bc3a42c15fe2652e5dfb4300.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值