设计大数据量表结构

上篇文章讲解了传统数据库的一些设计注意点。
本篇为第二篇,在大数据量的情况下,如何去提前设计这个表结构,来达到一个比较好的效果。对于团队,对于后续的维护和扩展都带来更大的便利。

自增id

自增id还是可以有,但是不是必须的了。但是建议还是每张表中有一个自增id。 为什么,还是那句话,做数据查询,迁移,排序的时候,有着天然的一些优势。

唯一标识

这个标识无论是token,还是其他例如订单的订单号或者其他唯一标识都行。 重点是唯一,不只是在单系统中唯一,而是需要在并发的情况,也能够保持唯一。

关于分布式id的生成方案,网上已经有很多了,这里就不重复了。谷歌搜索搜索,自己看下原理,跑跑demo,能够满足自己业务的最大并发情况下的唯一即可。

比如说你未来几年的最大并发也就是100,搞个能支持在几千并发下不会出现标识重复的实现方案即可,并发几万,几十万,真的需要吗?

后续如果真的能够达到几万并发,那说明什么?说明业务火爆了啊。难道还抽不出时间,抽不出人来做一个id生成方案的改造?这里有比较重要的一点,不要太过超前设计,没必要,也没那个时间。

创建时间&修改时间

创建时间和修改时间还是要有的,而且建议时间精确到毫秒级别,在上一篇,我没有说精确多少,那是因为并发不高,秒级完全够了。但是在大数据量的情况下,可能一秒有几十、几百、上千、上万的数据新增都是有可能的。那么秒级在这种情况下完全就不够看了,选择毫秒级别是一个比较好的选择。

分库分表

前面的唯一标识/创建时间可以说就是为了这步准备的。

但是怎么来设计分库分表,选择什么方式,范围还是hash,选择哪个字段,还是选择几个字段。平滑迁移还是停机迁移。

这些都没有唯一答案。只能是根据场景来区分不同的情况。下面举几个例子来进行一个讲解,不是标准答案,同一个场景为了满足不同的需求,也可能有不同的一个设计。

1:支付订单的场景

例如,订单每日新增千万级,那么在这个情况下。我们还需要区分一下。

1.1 订单号包含了时间戳

那么强烈建议按照时间维度进行分库分表。 也强烈建议在订单号中将时间戳放进去。
优点:

  • 单表的大小是可以预知的,一天多少订单量,一个月多少订单量
    非常便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加库表即可,不需要对已经存在的分片数据进行迁移。使用订单号进行范围查找时,可以快速定位查询,避免了跨片查询的问题。

缺点:

  • 最近的订单会存在着热点数据,可以通过其他方式进行解决,例如缓存等

1.2 订单号不包含时间戳

不包含时间戳,你可以选择创建时间来做范围分片。 或者使用订单号来做hash分片,也就是取模运算分片。

hash分片的缺点就是后期扩容会涉及到老数据的迁移,但是现在有一种方案可以避免该缺点,那就是使用虚节点,先占位,但不使用,需要的节点需要是2的次方个才行。大家可以去网上了解一下,这里就不展开了。 另外一个缺点就是跨片查询的性能问题,当查询条件中没有订单号的时候,会无法定位到数据库表,所以会遍历所有的库表,进行查询,再在内存中合并数据,取最小集返回,在这种情况下,分库分表反而会成为累赘。

其他一些分库分表带来的事务问题大家可以看看现在的一些分布式事务解决方案,都还挺不错的。阿里的Seata可以了解一下。

最后,分库分表,并不是一定要分库的,也可以只分表,这样很多分库分表的问题就不存在了。 分库分表还是要跟进实际的数据增长速度来评估,比如说,每年数据才几十万或者百万,那么没有必要进行一个过渡设计,单表即可。等数据库到了瓶颈,可以再考虑优化。

很多时候,瓶颈也不一定是在数据库。

性能优化

在这里,对于性能优化提一句,因为自己也刚完成一个性能优化的需求不久,提升性能2倍左右。这次优化完全没有动数据库。 主要优化点在:同步方法异步调用第三方服务、计算异步处理、批量单次调用、部分不变数据缓存 重点:拿资源(空间、线程)换时间

总结

当数据量大了之后,其实很多设计和传统的数据库还是没有很大变化的。

主要是要考虑到数据量大之后,该表如果分库分表,那么怎么设计更加合理一点,也许当下不需要分库分表,但是可以给以后少埋点坑。

但是注意,还是那句话,不要过度设计,也不要不去设计。简单的说,可以预估到以后的业务每日数据量新增是万级几十万以上的,就可以考虑下以后的分表,但是当期并不需要做。 但如果是日增百万千万级别,那么这个分库分表肯定是当期就需要进行的。 假如是日增几百几千的表,那么就不要花过多时间去考虑什么分库分表的方案了,真的用不上。

建议的一个提前思考时间,1年左右的思考维度设计比较好。即不会超前,也不会因为迭代了一两次业务就有人提出,不知道哪个**设计的结构,又得重新来设计。

最后,能够在技术方案时就明确的事情,绝不留到写代码的时候再去明确! 技术方案越清晰(注意:不是说超前设计,这里面有个度,只可意会不可言传),写代码越轻松,团队协作越流畅。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

去除字符串最后一位的几种方法

1.使用slice方法 /*** slice(start,end)* start 要截取的字符串的起始下标 如果为负数从后面开始算起 -1指的是字符串的最后一位* end 要截取的字符串的结尾下标 如果为负数从后面开始算起 -1指的是字符串的最后一位* start 和 end 都是下标*/let str "122889," str…

VBA中的字符串处理

目录 1 VBA中的字符串2 VBA中处理字符串的函数2.1 比较字符串2.1.1 比较运算符2.1.2 StrComp函数2.2 转换字符串2.2.1 StrConv函数2.2.2 Str函数2.2.3 CStr函数2.3 创建字符串2.3.1 Space函数2.3.2 String函数2.4 获取字符串的长度2.5 格式化字符串2.6 查找字符串2.6.1 InStr函…

使用Blink CEP实现差值聚合计算

使用Blink SQLUDAF实现差值聚合计算介绍了如何使用Blink SQLUDAF实现实时流上的差值聚合计算,后来在与付典就业务需求和具体实现方式进行探讨时,付典提出通过CEP实现的思路和方法。 本文介绍通过CEP实现实时流上的差值聚合计算。 感谢付典在实现过程中的…

企业微信小程序_授权登录接口获取用户userid

文章目录一、前置知识1. 阅读 企业微信小程序开发文档2. 企业微信小程序登录流程3. 微信小程序区别二、前端部分2.1. 调用登录接口2.2. 请求后端接口2.3. 项目源码三、后端部分3.1. yml配置3.2. 获取用户信息接口3.3. 获取token3.4. 工具类3.5. vo对象四、调试部分4.1. 模式切换…

我输给了一个 25 岁的男人

未来的你:小伙计你好,我是 10 年后的你,刚穿越回来,还是热乎的。现在的你:Are you sure?大哥,从你那憔悴的神色里可以看出日夜颠倒的作息和毫无爱情发酵的灵魂,随便喊个人来看看,咱…

阿里云公共DNS安全传输服务介绍(DoH/DoT)

概述 阿里公共DNS致力于为广大的互联网用户提供快速、稳定和安全的DNS解析。然而传统的DNS查询和应答采用UDP和TCP明文传输,存在网络监听、DNS劫持、中间设备干扰的风险: 网络监听风险:即便用户采用HTTPs加密的方式访问站点,DNS…

Excel VBA - 文件及目录操作

目录 一. 文件处理1.1 Name 语句1.2 FileCopy 语句1.3 Kill 语句1.4 GetAttr 函数1.5 SetAttr 语句1.6 FileLen 函数1.7 FileDateTime 函数二. 目录处理2.1 CurDir 函数2.1 ChDir 语句2.3 ChDrive 语句2.4 Dir 函数2.5 MkDir 语句2.6 RmDir 语句三. 文件读写3.1 Open 语句3.2 C…

企业微信小程序_集成微信小程序插件_地图选点插件

官网文档: https://lbs.qq.com/miniProgram/plugin/pluginGuide/locationPicker 具体操作参考官网文档即可,讲的很详细

一文教你如何在生产环境中在Kubernetes上部署Jaeger

作者 | Dotan Horovit翻译 | 火火酱~责编 | 晋兆雨出品 | CSDN云计算日志、指标和跟踪是“可观察性”领域的三大支柱。最近几个月,随着OpenTelemetry标准化以及Jaeger开源项目从CNCF孵化项目中顺利毕业,分布式跟踪领域出现了很多创新。根据DevOps Pulse…

一篇讲透如何理解数据库并发控制

01数据库并发控制的作用 1.1 事务的概念 在介绍并发控制前,首先需要了解事务。数据库提供了增删改查等几种基础操作,用户可以灵活地组合这几种操作,实现复杂的语义。在很多场景下,用户希望一组操作可以做为一个整体一起生效&…

工作簿长时间空闲时自动关闭

目录 1. 对关闭时间和关闭工作薄进行设置2. 利用 OnTime 方法对执行程序进行设置3. 对工作薄的变化进行设置1. 对关闭时间和关闭工作薄进行设置 在新建模块中声明一个时间作为全局的变量,该变量将是每次工作薄发生改变后延续的时间,另外再设置一个工作薄关闭的过程。 代码如…

打钱!我的数据库被黑客勒索了!

来源 | 小白学黑客责编 | 晋兆雨头图 | 付费下载于视觉中国数据库失陷昨天晚上,读者群里一位小伙伴发消息说自己的数据库被黑了,搞安全的我自然是立刻来了兴趣,加班加点开始分析起来,不知道的还以为我要熬夜等剁手节呢。这位小伙伴…

uni-app集成uview

文章目录一、uni_modules方式1. 创建uni-app项目2. 安装uview3. 安装SCSS插件二、配置步骤2.1. 引入uView主JS库2.2. 引入主题文件2.3. 引入uView基础样式2.4. 配置easycom组件模式2.5. 实战三、zip方式3.1. 创建uni-app项目3.2. 下载uview3.3. 解压重命名3.4. 拷贝UI3.5. 安装…

阿里云飞天洛神2.0:高性能网络软硬一体化技术实践

云网络架构 云计算从9年前被质疑为新瓶装旧酒,到经过多年的高速发展,正在成为水电煤一样的基础设施。云网络构建在物理网络之上,为云计算提供灵动、智能的网络连接。云网络的性能和稳定性是云计算的基石。 VPC是云网络的基础,VP…

作为后端开发如何设计数据库系列文章 设计SaaS系统表结构

在公司做了一年的SaaS内核系统,但是有些东西不知道能不能透露出来。我尽量在不透露一些敏感东西的情况下(这个度我无法把控,只能是笼统了),将某些关于数据库方面的精髓传递出来。如果表达不畅,请谅解。 前…

重学 VBA - 基础与实战篇(含正则表达式)

目录 前置内容1. 单元格对象属性与方法1.1 查找最后的行、列1.1.1 End 属性1.1.2 SpecialCells 和 UsedRange1.1.3 Find 方法1.1.4 四种方法属性效果比较1.2 多重循环(案例)1.2.1 实现数据之间的匹配(不同列)1.2.2 实现数据之间的匹配(同列)1.2.3 排序 - 简单选择排序法1…

js 时间比较大小

const startTime parseInt(this.timeValue.replace(:, ));const endTime parseInt(this.timeValue2.replace(:, ));//进行比较if (startTime > endTime) {//添加校验提示console.log("startTime>endTime")} else {console.log("startTime<endTime&qu…

新一轮支付革命,利楚扫呗的数据库优化之路

中国移动支付市场崛起过程中&#xff0c;第三方、第四方等非银行支付机构在2017年至2019年之间&#xff0c;把移动支付交易量从300多亿笔拉升至近1800亿笔&#xff0c;充分彰显以扫码支付为代表的移动支付革命引领一时风潮。 利楚扫呗作为华中地区领先的金融收单企业也是其中一…

IM、RTC技术两生花,看融云如何打造“IM+RTC+Push”一站式通信云服务

11月9日&#xff0c;融云宣布完成数亿元人民币的D轮融资。从李佳琦和明星扎堆的电商直播&#xff0c;到疫情期间在线教育的全面普及&#xff0c;再到5G技术进入商用&#xff0c;实时音视频技术&#xff08;Real-Time Communication&#xff0c;以下简称RTC&#xff09;迎来了全…

Nginx实现通过不同的url前缀访问不同的前后端项目

&#xff0c;所以目前就可以通过给网页访问链接增加不同的url前缀&#xff0c;来让Nginx去实现同一端口下访问不同的前后端项目。具体配置如下&#xff1a; &#xff08;我这里是前端两个项目各自对应后端的两个服务&#xff09; server {#这里默认监听80端口&#xff0c;可根…