慢查询解决思路
目标
不在sql白名单里的需求,具体要求
数量目标:
要求sql慢查询降低, ,各个项目,慢查询每周不能出现超过3个不同类型慢查询sql。
每个数据库的慢查询总数不能查过X哥, 总的慢查询耗时不能超过Ys。
解决效率目标:
项目周期内:
当日提出技术方案,改造完成,提测,并且明确测试时间以及上线时间, sql负责人来R。
项目结束后:
核心功能关联sql:当日提出技术方案,给出明确的排期时间
非核心功能关联sql: 给出明确的排期以及负责人。
现状
当前每日慢查询200左右(不准确统计,待DBA验证),分为如下几类:
- 索引创建不当:
- 无索引
- 未命中索引
- 索引区分度不高
- 关联查询
- 报表类
- 核心功能类
- 非核心功能(不包含报表)
- 数据量过大
- 表中数据超过3000万
- 外部影响
- 其他查询导致数据库性能降低,引发了慢查询
- 其他非业务原因导致的数据库问题,引发慢查询
- 机器的系统升级?
- 网络延迟
实施路径
发现问题
- 慢查询日报表(1ms→ 500ms )
- 现阶段人肉维护,希望dba工具化
- 表信息扫码
- 表结构,索引,字段合理性
- 数据量
- sql排查
- 扫描项目中的join, like,。(P1)
- 排查循环调用, 通过sql的调用量排查。(P0)
- 排查sql中的事务, 确认是否有大事务。(P0)
- mapper中的条件组合梳理,一个sql干一类事情(工作量较大P2)
解决问题
通用解决方法
- sql优化类
- 添加索引
- 调整sql, 命中联合索引
- sql拆分,一条拆分成多条
- 批量查询,循环改为批量
- 最小结果集:查询列数最少,查询行数最少
- 缓存,降低sql 查询频次
- 避免大数据集的聚合
- 查询中不能没有where或者条件仅有 1=1
- 数据库优化
- 分库分表
- 是否需要扩容
- 物理隔离
- 业务隔离
- 复杂查询隔离--报表独立从库
- 业务优化
- 业务流程调整,避免或者减少查询
- 流程优化,减少复杂逻辑
- 防止重复提交
- 业务调整,功能的使用频率以及必要性
慢sql解决流程图(待补充)
排查慢查询->业务使用场景是否合理->有没有其他的实现方式->索引是否命中->索引区分度适合够->数据量是否过大。
预防问题
- dml规范以及review
- 代码review机制,出来规范,
- 监控告警
- 慢查询监控告警
- 数据库服务指标监控告警,
- 主从延迟报警
诉求
- 提供按日慢查询统计报表: 邮件和查询工具均可。
- 数据库性能分析工具: 用于日巡检使用。
- cpu
- 内存
- io
- 网络
- qps
- tps
- wps
- 数据延迟情况
- dba支持最大结果集1000限制 (将来要实现)。
- 耗时超过5秒, 自动kill, 同步消息给业务方(未来要实现)。
执行优先级
待补充讨论
报表独立从库
待整理
TODO, EC那边存在强制走主库的方式,可能会先包一个事物。我们的业务需要check.
本月对saas功能定级跟产品一起确定大事务的日志,可以找dba一起排查确认阿里云的功能, 具体能够给我们提供哪些数据和报表
对dba的诉求1. 慢查询日报,其他性能报表2. 是否需要扩容3. 拆分的参考依据
sql 排查中,关注order by
sql注入的风险
执行计划
日期
|
目标
|
备注
|
日期
|
目标
|
备注
|
2019-10-14
|
|
慢查询数据不准确,需要dba更大的支持
大事务目前还不太清晰, 目前仅有钉钉报警
|
2019-10-15
|
|
明天中午提测报表优化
慢查询报表存在问题,需要讨论,应该拉DBA一起讨论
|
2019-10-16
|
|
|
总体
|
|