定位慢查询以及分析
导致慢查询的一些原因
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
此时的表现为 :页面加载过慢 接口压测响应时间过长(1s以上)。
定位方法(定位哪一条)
方法一 开源工具
- 调试工具 Arthas
- 运维工具 prometheus Skywalking
MySql自带慢日志
需要在配置文件中开启 设置开启以及时间阈值(ps 2s)
注意:一般在调试阶段开启
注意 一般结合自己项目说!!!!!
分析慢SQL语句的原因
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
采用 EXPLAIN 或者 DESC命令获取执行SELECT的信息
方法 直接在语句前加 explain 或者desc
①possible key 当前sql可能会使用到的索引
key 当前sql实际命中的索引
key_len 索引占用的大小
主要是后两条:确定索引本身是否失效
②Extra 额外的优化建议(了解是否回表)
Extra 含义
Using where; Using Index 查找使用了索引,需要的数据都在索引列中能找到,不需要回表查询数据
Using index condition 查找使用了索引,但是需要回表查询数据
③type 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all (了解是否有进一步优化空间,是否有index以上的)
- system:查询系统中的表
- const:根据主键查询
- eq ref:主键索引查询或唯一索引查询
- ref:索引查询
- range:范围查询广
- index:索引树扫描
- all:全盘扫描
注意:建议保持在index以下
优化超大分页
小数据集驱动大数据集
优化超大分页处理,采用覆盖索引加子查询形式优化
PS:
select * from db limit 1000000,10;
//改成
select *
from db d,
(select id from db order by id limit 1000000,10) a
where d.id = a.id;