【msyql】三 left join 左连接 验证全量接口自动感知功能

版权声明:转载请标明出处。 https://blog.csdn.net/u010720408/article/details/88888927

需求

压测1000 dps下自动感知各个系统上报数据的project、api、field等相关信息,需要sql验证几十个project、数百个api、数百个field的字段感知数据在分布式环境下是否一致。

自动感知逻辑:实时引擎过采样,入JVM中ArrayBlockingQueue队列;另一个Spout/Bolt消费JVM中ArrayBlockingQueue队列自动感知project、api、field 是否新增,并把入库的sql语句放入相应redis队列;mysqlSpout/Bolt消费redis队列走不通操作分支执行sql。

left join 形成大表 再groupby

sql

三张表project表、api表、field表

①验证project中api_size列值 是否与api中同project下的api个数一致
大表sql
select p.projname,p.api,a.project,a.api from sm_sys_proj_relate p
left join sm_all_api_desc a
on p.projname = a.project

验证个数sql
select projname,project,min(api_size),max(api_size),count(api),count(distinct api)
from (select p.projname,p.api,a.project,a.api from sm_sys_proj_relate p
left join sm_all_api_desc a
on p.projname = a.project
) t
group by projname,project

验证结果可说明,project表中project没有重复插入同一project,api_size感知也是实时对应到api表中个数;api表中api也没有重复插入;

②验证api表中field_size与field表中 同api下field个数是否一致
大表sql
select a.project,a.api,a.field_size,f.field from sm_all_api_desc a left join sm_all_api_field f
on a.project=f.project and a.api=f.api

验证个数sql
select project,api,min(field_size),max(field_size),count(field),count(distinct field)
from (select a.project,a.api,a.field_size,f.field from sm_all_api_desc a left join sm_all_api_field f
on a.project=f.project and a.api=f.api
) t
group by project,api

验证结果中,min、max一组是一样的,count与count(distinct)是一样的,但在压测环境下有少量语句min/max一组的数比count/count(distinct)的小1

奇怪现象目前怀疑:
insert on duplicate key update语句与统计size个数顺序在入mysql的redis队列和mysqlSpout读取没有问题;
但是mysqlBolt执行完成先后顺序压测下,insert走的严格模式(去mysql获取column类型,数据格式转换等操作),而update 走的是直接执行sql语句模式,前者在压测下会慢于后则update 执行,导致size个数比真实个数小于1;

解决:把insert 改为走直接执行sql语句模式,不必经过严格检查、数据转换。

猜你喜欢

转载自blog.csdn.net/u010720408/article/details/88888927