数据库问题排查以及SQL优化

数据库CPU飙高

通过top等命令确定是否数据库进程CPU飙高

通过命令show processlist找出耗资源较大的SQL

如果没有特别耗资源的SQL,就查看session是不是突然增多,可以通过限制连接数

如果有特别耗资源的SQL,排查耗资源的SQL是否命中索引、是否表的数据量特别大

kill掉这个消耗大的线程,看看CPU使用率是否下降,调整这条SQL(优化),再手动执行来验证

 

慢SQL排查

打开慢查询日志开关,设置阈值(默认3s),查看日志,日志会记录慢SQL的语句和执行时间

 

SQL优化

先要找到需要优化的SQL,查看执行计划(explain),需要重点关注的字段有
type:system > const > eq_ref > ref > range > index > all, 正常情况下,最少要达到range
key:实际命中的索引
possible_keys:可能的索引
rows:估算的读取行数
extra:里面比较重要的有 using index需要回表),using index condition索引下推

1. 在合适的列上创建索引并能够命中索引,列的值足够离散、列的值不会经常更新、出现在where/order by/group by 后面的列
2. 建立联合索引,尽量实现覆盖索引和索引下推
3. 减少回表次数,比如深度分页的优化
4. 表连接不宜过多,尽量使用inner join代替left join,小表驱动大表
5. 避免使用union,改用union all(不去重)
6. 优先进行过滤, 比如where name like 'kevin%' group by name having age < 18 优化为 where name like 'kevin' and age < 18 group by name
7. 批量进行插入、更新和删除的操作,避免太大
7. 避免其他能让索引失效的情况
8. 尽量降低隔离级别为RC(严格来说不属于sql优化的范围)
9. 避免长事务(严格来说不属于sql优化的范围)

 

 

索引不生效的原因

组合索引不满足最左(前缀)匹配原则
以 % 开头的 LIKE 查询
select * (大概率)
在索引列上进行计算、函数、类型转换、隐式转换等操作
where条件使用or、使用is null、is not null
in的取值范围较大
表的数据量很小

 

posted @ 2024-04-15 21:34  坏男银  阅读(10)  评论(0编辑  收藏  举报