mysql学习专题

mysql 专栏

mysql cpu >=100% 排查

查询正在占用mysql的 sql语句

1
2
# mysql数据集 root权限的用户
show full processlist
Id User Host db Command Time State Info
363 root 39.170.43.242:3721 gwdb Sleep 29
364 root 39.170.43.242:3722 gwdb Query 0 init /* ApplicationName=DBeaver Enterprise 21.0.0 - SQLEditor <Script.sql> */ show full processlist

其中 state 是run 的,表示正在抢占mysql 资源

time 表示占用的时间

优化1 :索引

根据查询到的sql,统计表中记录数量大小

如果超过十万级,可以根据 where 字段添加索引

经过验证,三层嵌套的sql,在加上索引后,速度提高了将近2倍

优化2:sql

如果已添加索引,则需要分析sql,将 sql拆分,一段一段执行,探究哪一段执行较为缓慢

这一段 一般是用了mysql的内置函数,例如 data,str 等

需要替换为 用后端语言计算好后的sql,避免mysql 执行过慢

mysql查询优化

怀疑select *

  1. select * 不会走索引,变成全表扫描
  2. select * 会返回冗余信息

衡量查询性能的指标

响应时间、扫描的行数、返回的行数

mysql 查询范围

速度:满 -> 快,查询行数:多 -> 少

全表扫描 -> 索引扫描 -> 范围扫描 -> 唯一索引查询 -> 常数索引

例如有索引(唯一索引)时,sql 在 mysql 上会优化为如下:

图片

当删除索引,再次 查询,则sql 会被mysql 优化器识别为全表扫描

图片

where 如何搭配 select

图片

优化方式

图片

切分查询

图片

分解关联查询

图片

图片

mysql查询的执行路径

图片

mysql 执行sql时的各个状态

图片

图片

mysql 将sql转换成执行计划树

图片

优化关联查询

图片

图片

图片