面试官问如何优化慢SQL?

本文介绍了如何定位和优化慢SQL,包括通过慢查询日志、EXPLAIN分析执行计划,关注type、rows、filtered、extra等关键指标,以及show profile和trace工具的使用。文章提供了多个实际案例,涉及最左匹配、隐式转换、大分页、IN查询优化等场景,给出了解决策略和改进建议。
摘要由CSDN通过智能技术生成

前言

在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多 SQL 语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的 SQL 就是整个系统性能的瓶颈。

SQL 优化一般步骤

通过慢查日志等定位那些执行效率较低的 SQL 语句

explain 分析SQL的执行计划

需要重点关注 type、rows、filtered、extra。

type 由上至下,效率越来越高:

  • ALL 全表扫描

  • index 索引全扫描

  • range 索引范围扫描,常用语<,<=,>=,between,in 等操作

  • ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中

  • eq_ref 类似 ref,区别在于使用的是唯一索引,使用主键的关联查询

  • const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询

  • null MySQL 不访问任何表或索引,直接返回结果

  • 虽然上至下,效率越来越高,但是根据 cost 模型,假设有两个索引 idx1(a, b, c),idx2(a, c),SQL 为"select * from t where a = 1 and b in (1, 2) order by c";如果走 idx1,那么是 type 为 range,如果走 idx2,那么 type 是 ref;当需要扫描的行数,使用 idx2 大约是 idx1 的 5 倍以上时,会用 idx1,否则会用 idx2

Extra:

  • Using filesort:MySQL 需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配 WHERE 子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行;

  • Using temporary:使用了临时表保存中间结果,性能特别差,需要重点优化;

  • Using index:表示相应的 select 操作中使用了覆盖索引(Coveing Index),避免访问了表的数据行,效率不错!如果同时出现 using where࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值