【稳定性:数据库】聊聊DB慢查询

一、告警和慢查询

  • 治理慢查询的前提,最好建设看板和监控,方便我们能够快速的捞取数据和变化,以及及时的关注告警;
  • 看板至少包含:数据库名、数据库类型、查询sql语句的机器IP、查询耗时、慢查询数量、关联的服务或应用、慢查询排序、数据库端口、SQL语句、索引扫描/表扫描、explain信息。
  • 当然,直接在MySQL命令终端也是可以查看的,需要开启SlowLog,默认是关闭的,由参数slow_query_log决定。
  • MySQL 默认慢查询时间为 100ms, 超过这个时间阈值的 SQL 都会被记录下来。一般情况下 MySQL 的 SQL 响应时间比较稳定, 但是数据库一些正常的内部行为可能会偶尔出现抖动 (最常见的是: 数据库刷脏)。所以我们评估一个实例是否正常一般是 P999 分位的响应时间。

二、慢查询分析和调优思路

找到关键信息:

在慢查询日志里使用explain进行查询语句分析;比较核心要关注的字段一般有:select_type、type、possible_keys、key、rows、Extra等

select_type:select类型

代表表示查询中每个select子句的类型,是简单查询还是联合查询还是子查询,一目了然:

  • SIMPLE:简单查询(不使用关联查询或子查询)
  • PRIMARY:如果包含关联查询或者子查询,则最外层的查询部分标记primary
  • UNION:联合查询(UNION)中第二个及后面的查询
  • DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
  • UNION RESULT:UNION的结果,union语句中第二个select开始后面所有select
  • SUBQUERY:字查询中的第一个查询
  • DEPENDENT SUBQUERY :子查询中的第一个查询,并且依赖外部查询
  • DERIVED:派生表的SELECT, FROM子句的子查询
  • MATERIALIZED:被物化的子查询
  • UNCACHEABLE SUBQUERY:一个子查询的结果不能被缓存,必须重新评估外链接的第一行
table:查询使用的表
type:连接类型

表示MySQL在表中查找所需数据的方式,也称“访问类型”,不要用All,代表全表扫描,是非常差的模式,参考:

  • system:查询对象表只有一行数据,且只能用于MyISAM和Memory引擎的表,这是最好的情况
  • const:基于主键或唯一索引查询,最多返回一条结果
  • eq_ref:类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
  • ref:表示上述表的连接匹配条件&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值