慢SQL与一条耗时很长的SQL

一、最近有一个任务,需要数据库对几张表结果进行计算,生成报表。已知条件为:

数据库中已有的三张表A、B、C进行拼接操作,三张表的数据量分别为A:几万,B:几十万,C:几万。

对B表所有数据,通过关联的ID等字段,补全存储在A\C 中的信息,(B的数据也可能在A\C中不存在关联)并将结果写入到D表

 

旧的方案有两种:

1、首先批量读取表B的数据,然后逐条处理B的记录:查询关联的A\C 表数据,进行计算,最后将计算的结果写入到表D。)

2、利用一条SQL语句insert select jion,将计算过程交给数据库进行计算并且批量插入到表D。

 

方案一的实践结果很慢,整个计算完耗时4个小时。系统需要不断的读取数据库,写入数据库,IO耗时太高。而且需要控制好每次读取B表的数据条数,太大容易产生OOM,IO耗时更多了

方案二的时间结果将计算压力转移到了数据库,并且减少了数据库的连接次数,一条SQL搞定。耗时50分钟。这样Java线程一直在等待SQL执行结果,很容易超时。对于使用了TDDL中间件后,随着数据量的增大,需要不断的调整等待时间上限,不是一个合理的选择。

 

二、慢SQL问题回顾

慢SQl查询时间:
1、查询cnlearn_grop_detail表,时间超过1s的sql语句,都会被记录为慢sql
2、整个查询时间包括排队等待时间,所以当访问量不大的时候,可能看不到问题,因为不需要排队等待
3、集团给每台机器配置的数据库连接池的链接数是5-10个链接​​,两台机器也就是20个连接为上线。因此如果并发数量超过这个数目,就会需要排队
4、发生问题时,当时的并发查询数量为100-200,所以导致慢SQL爆发​
5、在优化索引之前,每条查询语句在700ms左右,算上等待时间,就出问题了。
posted @ 2019-10-22 10:41  sliec  阅读(2214)  评论(1编辑  收藏  举报