跨表大事务如何优化
来源:2-3 事务原则与实现:JDBC事务(上)
目科将
2020-03-22
现状描述
有三张表, a,b,c, 关系示意如下:
c表
| cid | c名称 | bid |
|---|---|---|
| 1 | c1 | 1 |
| 2 | c2 | 1 |
b表
| bid | b名称 | aid |
|---|---|---|
| 1 | b1 | 1 |
| 2 | b2 | 1 |
a表
| aid | a名称 |
|---|---|
| 1 | a1 |
| 2 | a2 |
现在需要批量增加 a b c三张表的记录,且所有记录要么都成功增加,要么能失败,目前的处理如下伪代码示意
@Transaction(...)
onOneTransaction(){
batchA();
foreach to batchBWithAid();
foreach to batchCWithBid();
}
问题
现在 C表和B表 都是比较大的表 有1000w量级的记录数, 因为上面三表在一个事务上执行(基于业务上要求要么都成功or失败),导致执行时间比较长,而且因为还有其它业务在单独操作这三张表, 会相互影响, 想问老师这种情况该怎么优化,有没有好的建议
写回答
1回答
-
大漠风
2020-05-11
不好意思,前段时间在家办公,但是因为两个项目赶在一起,一直没有时间看这个。
由于这个都是在同一个数据库,所以,还是从数据库和jdbc这一方面来尝试优化。
首先我想到的,就是批处理,针对表A、B、C,分别用3个batchInsert来批量操作,如果是用的spring data,或mybatis等框架,都有相应的方式进行批量更新。
其次,你提到这几个表都是千万级别,那么,对表结构的设计、索引和外键等,都需要考虑,去掉没必要的索引(数据更新需要更新索引,如果索引过多就会影响性能),使用合理的字段类型,减少无谓的数据存储(这可以减少数据存储使用的磁盘,对数据量大的表进行查询时,要尽量减少读磁盘的次数)。
虽然在数据量大的时候,可以使用分库分表,但是这会增加系统的复杂度,如果就是三五千万的数据量,还是不需要做分库分表。
00
相似问题