sql优化,建表用触发器更新表

本文介绍了一种通过创建额外表和使用触发器优化复杂SQL查询的方法,以提高查询效率。通过实例演示了如何创建触发器以更新副表值,从而在数据量大时显著提升查询速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用到一张表,然后sql是一条需要关联两张表的查询的,所以比较慢

SELECT c.name juwei,count(1) as value FROM j_sq_rjbxx a,j_dict_xzqh_china b,j_dict_xzqh c WHERE concat( substr( a.HJDXZQHDM, 1, 2 ),'0000' ) = b.dm AND a.syrklbdm = '02' and b.mc='江苏省' and c.code=a.iszzrs group by a.iszzrs order by value desc在这里插入图片描述
然后查了一下数据为12w,并且主表不会经常改变,所以就想到额外使用一张表来存储需要查询的数据,
主表
于是乎,就新建一张表来存储juwei和vlaue,建表很简单,主要的是要定义两个触发器,用来出发主表的更新与删除操作,用来跟新副表的value值,

触发器

--触发器,更新 身份居委表的数据
create trigger trigger_j_sq_rjbxx after insert
on j_sq_rjbxx for each row
begin
	set @juweicode = new.iszzrs;
	set @shenfencode = new.HJDXZQHDM;
	if(new.HJDXZQHDM is not null and new.syrklbdm='02' and new.iszzrs is not null)
		then
			set @juwei = (select name from j_dict_xzqh where code=@juweicode);
			set @shenfen = (select mc from j_dict_xzqh_china where dm = concat(substr( @shenfencode, 1, 2 ),'0000'));
			update j_dict_committee_city set j_dict_committee_city.value = j_dict_committee_city.value + 1 where juwei=@juwei and mc=@shenfen;
	end if;
end;
--还有一个 删除 触发器
create trigger trigger_j_sq_rjbxx_delete after DELETE
on j_sq_rjbxx for each row
begin
	set @juweicode = old.iszzrs;
	set @shenfencode = old.HJDXZQHDM;
	if(@shenfencode is not null and old.syrklbdm='02' and @juweicode is not null)
		then
			set @juwei = (select name from j_dict_xzqh where code=@juweicode);
			set @shenfen = (select mc from j_dict_xzqh_china where dm = concat(substr( @shenfencode, 1, 2 ),'0000'));
			update j_dict_committee_city set j_dict_committee_city.value = j_dict_committee_city.value - 1 where juwei=@juwei and mc=@shenfen;
	end if;
end;

解释一下sql,创建一个触发器,insert的时候触发,new是insert的时候的插入的新行,这边我是需要juwei,和shenfencode两个字段,所以我定义出来,然后这两个字段根据两个关联表查到实际所对应的实际含义(cdoe)字段,然后判断再哪个行数据上进行自增,同样的删除触发器就是实现自减。

检验

这是表新建的查询表原先的数值,243个,
原本数量

insert into j_sq_rjbxx (rid,syrklbdm,iszzrs,hjdxzqhdm) values ('121212','02','04014003','320000')

我们向主表插入一个字段,可以看到数值加了1,说明触发器是没问题的。
插入后的数值

最后

执行一下我们所需要的查询,显然速度已经很可以了,
在这里插入图片描述
这只是12w的数据量,如果这是几百万的话,显然是非常有必要的,并且再建立了查询表之后还需要给查询表加索引之后就能更快的拿到我们需要的数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丸子呢

致力于源码分析,期待您的激励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值