一、告警和慢查询
- 治理慢查询的前提,最好建设看板和监控,方便我们能够快速的捞取数据和变化,以及及时的关注告警;
- 看板至少包含:数据库名、数据库类型、查询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:表示上述表的连接匹配条件&