数据库表设计中使用横向表切割来降低并发冲突

近日在设计《威博文件管理系统》的文件标签系统中的一点体会。

 

近来根据用户反馈和原定的开发计划,为《威博文件管理系统》设计一个“文件标签”模块,实现的功能类似于很多大型网站的标签功能,能够实现智能标签功能。

 

开始的数据库表结构,使用一个单一的“文件标签”表,文件标签表,结构如下:

 

主键:char(36)

标签名称:varchar(50)

标签排序:int

主观权重:bit

主观推荐:bit

时间戳:bigint

版本号:int

引用计数:int

点击计数:int

 

对应的实体模型为

 

 

经过一段时间的测试后发现,“文件标签”表中,各个字段的的变化速度有很大的不同,其中引用计数、点击计数、变化很频繁,而其它字段的内容相对变化就比较稳定,一旦生成,相对比较稳定,这样在并发程度高时,常常导致数据更新冲突,虽然可以通过@version注解可以保证数据的乐观锁定发生作用,数据的一致性不被破坏。但是由于把变化频度差异很大的字段放在同一张表上,导致冲突发生的概率增大,降低了系统的效能。

 

于是想到了对该表的横向切割,以便获得更好的并发性能。

 

切割后,分为三个表,《文件标签》作为主表,《文件标签引用计数》《文件标签点击计数》作为从表,三个表共用主键,三表结构如下:

 

《文件标签》表结构

主键:char(36)

标签名称:varchar(50)

标签排序:int

主观权重:bit

主观推荐:bit

时间戳:bigint

版本号:int

 

《文件标签引用计数》表结构

主键:char(36)

引用计数:int

时间戳:bigint

版本号:int

 

《文件标签点击计数》表结构

主键:char(36)

点击计数:int

时间戳:bigint

版本号:int

 

对应的三张表的实体模型为

《文件标签》表实体Bean

 

《文件标签引用计数》表实体Bean

 

《文件标签点击计数》表实体Bean

 

经过实地测试,并发效能大大提高,而通过对主表的分割,而导致的连接操作带来的速度损失相对较小,某些方面还可以增大综合读写速度。

 

体会总结如下:

当我们在设计时,发现同一张表内,字段的变化频度差异过大时,为了获得更好的并发操作性能,降低潜在冲突,这时可以对表,进行横向分割,按照字段的不同的变化频度,合理地置于不同的主从表内,以此来提高性能。特别是在Web应用程序中,使用版本号来进行乐观锁定时,对性能的提高更加有好处,可以大大降低冲突发生的概率。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值