作为后端开发如何设计数据库系列文章(二)设计大数据量表结构

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本文来自读者投稿,作者:陈浩翔

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

自增id

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

唯一标识

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

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

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

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

创建时间&修改时间

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

分库分表

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

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

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

1:支付订单的场景

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

1.1 订单号包含了时间戳

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

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

缺点:

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

1.2 订单号不包含时间戳

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

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

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

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

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

性能优化

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

总结

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

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

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

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

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

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
1天前
|
JavaScript API 调度
深入理解Node.js事件循环及其在后端开发中的应用
【7月更文挑战第30天】本文旨在通过深入浅出的方式,解析Node.js事件循环机制的工作原理及其在后端开发中的实际应用。我们将从事件循环的基本概念出发,逐步探讨其与异步I/O操作的关系,以及如何利用事件循环优化后端性能和处理高并发请求。文章将结合实际案例,为读者提供清晰的认识和应用策略。
|
1天前
|
消息中间件 Kubernetes 数据库
深入理解微服务架构及其在现代后端开发中的应用
【7月更文挑战第30天】随着技术的进步和业务需求的多样化,传统的单体应用架构已逐渐不能满足快速迭代和可扩展性的需求。微服务架构作为一种新兴的软件开发架构风格,以其独特的设计理念和优势,成为解决复杂系统问题的有效途径。本文将深入探讨微服务架构的核心概念、设计原则以及在实际后端开发中的应用场景,帮助开发者更好地理解和运用微服务架构。
8 2
|
1天前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合
|
3天前
|
存储 监控 网络架构
后端开发中的微服务架构实践
【7月更文挑战第29天】随着互联网技术的飞速发展,传统的单体应用已经无法满足现代业务的需求。微服务架构作为一种新兴的软件开发模式,以其独特的优势被越来越多的企业所采纳。本文将深入探讨微服务架构的概念、设计原则以及在后端开发中的具体实践方法,帮助开发者更好地理解和应用微服务架构。
13 3
|
1天前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理
循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理
|
2天前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
|
1天前
|
开发框架 前端开发 关系型数据库
使用egg.js开发后端API接口系统 什么是Egg.js
使用egg.js开发后端API接口系统 什么是Egg.js
|
1天前
|
开发框架 前端开发 JavaScript
循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理
循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理
|
1天前
|
存储 开发框架 前端开发
循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示
循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示
|
3天前
|
持续交付 数据库 开发者
探索后端开发中的微服务架构
微服务架构作为一种现代软件开发方法,正逐步改变着后端开发领域的面貌。通过将复杂的应用程序分解成一套小的、独立的服务,微服务旨在提高可扩展性、可维护性和敏捷性。本文将深入探讨微服务的核心概念、优势与挑战,并通过实际案例分析其在企业中的应用效果。
6 0