慢sql治理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了慢sql治理相关的知识,希望对你有一定的参考价值。

参考技术A 什么是慢sql?慢sql的定义,目前共识是rt>1S,当存在1s以上的sql,qps比较高(150)时候,大概率会发生线上问题
风险维度:
执行时间rt:执行时间超过1s
平均扫描行数:扫描行数过高则一般说明sql有优化空间
全表扫描:一般是由于没有配置索引
平均返回行数:返回行数过高,对系统逻辑有一定的风险
索引覆盖:当前sql不是最佳索引

索引知识:
查看表索引:show index from table_name
查看sql语句影响行数:explain select * from user where phone=‘xxx’

索引错用:
1.类型隐士转换
wrong: select * from user where phone=xxx
right: select * from user where phone=‘xxx’
2.索引字段使用函数或者运算
wrong: select * from user where Date(create_at)=‘2019-12-12’
right:select * from user where create_at>‘2019-12-12’ AND create_at<'2019-12-13'
3.谨慎使用OR,OR中只要有一个没有索引,就会走全表扫描
select name from user where id=10 and sex=‘男’,sex没有索引,导致走全表
4.Like 正确使用,like ‘%xxx’ |like ‘%xxx%’,会让索引失效,但可以使用like‘xx%’
5.不应该使用select *,而是需要什么查什么
select name from user,当name有索引的时候,直接扫描索引,不需要再扫表,索引覆盖
6.谨慎使用order by导致的内存排序
7.当搜索范围很大时,mysql估计使用全表扫描要比索引快,则不适用索引

慢SQL治理最佳实践

慢SQL治理主要从三个方面进行优化

  1. 从数据表的定义开始优化
  2. 从索引设计开始优化
  3. 从查询开始优化

优化表设计

  1. 表字段长度尽量紧凑,字段尽量不冗余
  2. 字段类型尽量考虑用简单的类型
  3. 字段尽量有默认值,且默认值尽量不要用null

优化索引

设计索引的时候,尽量让查询用到索引,并且减少回表次数。

  1. 业务查询频率高的字段尽量设计成覆盖索引,比如select age, name from user where name=\'张三\', 如果建立了(name, age)的覆盖索引,可以避免回表查询
  2. where语句要能用到索引,并且避免出现使索引失效的情况,比如对索引字段进行了函数操作等
  3. 排序字段尽量按照索引排序,避免使用到外部排序,比如file sort

优化查询

  1. 确保select 的字段都是业务所需的,避免直接使用select *
  2. 复杂查询拆分成多个简单查询
  3. 一次返回的数据条数不能太多,分批次返回
  4. 限制in查询中的条目
  5. 分页查询时,页数越大时,性能越差,建议结合id>LastedMaxId查询
  6. join查询的表不能太多,后面尽量优化为单表查询

以上是关于慢sql治理的主要内容,如果未能解决你的问题,请参考以下文章

慢SQL治理分享

慢SQL治理最佳实践

阿里慢SQL治理5大经典案例

围剿慢SQL,工行MySQL研发管控和治理实践(附PPT)

Mysql慢SQL分析及优化

MySQL慢查询:慢SQL定位日志分析与优化方案