后端存储实战课
李玥
美团高级技术专家
44005 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语 (1讲)
后端存储实战课
15
15
1.0x
00:00/00:00
登录|注册

14 | 订单数据越来越多,数据库越来越慢该怎么办?

迁移数据程序
删除订单表历史数据
上线新版本代码
数据迁移
创建历史订单表
查询统计功能调整
修改代码少
流程
拆分订单
拆分数据策略
提升查找性能
拆分数据
取决于查找算法和数据结构
优点和缺点
OPTIMIZE TABLE
删除后磁盘空间释放
删除SQL优化
子表归档
归档历史订单
分片(Shard)
数据总量
查找时间复杂度
归档历史订单 vs. 分库分表
批量删除大量数据
存档历史订单数据提升查询性能
解决方法
数据库性能问题
思考题
订单数据持续增长

该思维导图由 AI 生成,仅供参考

你好,我是李玥。
在前面几节课,我们一起学习了在并发持续高速增长的情况下,如何来逐步升级存储。今天这节课我们来聊一聊,如何应对数据的持续增长,特别是像订单数据这种会随着时间一直累积的数据。
为什么数据量越大数据库就越慢?你得理解这里面的根本原因。
我们知道,无论是“增删改查”哪个操作,其实都是查找问题,因为你都得先找到数据才能对数据做操作。那存储系统性能问题,其实就是查找快慢的问题。
无论是什么样的存储系统,一次查询所耗费的时间,都取决于两个因素:
查找的时间复杂度;
数据总量。
这也是为什么大厂面试时总喜欢问“时间复杂度”相关问题的原因。查找的时间复杂度又取决于两个因素:
查找算法;
存储数据的数据结构。
你看,这两个知识点也是面试问题中的常客吧?所以人家面试官并不是非要问你一些用不上的问题来为难你,这些知识点真的不是用不上,而是你不知道怎么用。
我们把话题拉回来。对于我们大多数做业务的系统,用的都是现成的数据库,数据的存储结构和查找算法都是由数据库来实现的,业务系统基本没法去改变它。比如说,我们讲过 MySQL 的 InnoDB 存储引擎,它的存储结构是 B+ 树,查找算法大多就是树的查找,查找的时间复杂度就是 O(log n),这些都是固定的。那我们唯一能改变的,就是数据总量了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何处理订单数据持续增长导致数据库性能下降的问题。作者首先解释了数据库性能问题的根本原因,即查找时间复杂度和数据总量。针对海量数据导致存储系统慢的问题,作者提出了“分片”思想,即将一大坨数据拆分成N个小坨,以提升查找性能。针对订单数据的情况,文章介绍了归档历史订单数据以提升查询性能的方法。通过将历史订单数据移到另外一张历史订单表中,可以减少新数据的数据量,从而提升查询速度。文章还详细描述了归档历史订单的流程,包括创建历史订单表、迁移数据、测试新版本代码等步骤。此外,文章还介绍了如何批量删除大量数据,并对删除SQL进行了优化。最后,文章强调了对线上业务影响的最小化和数据迁移过程中的注意事项。整体而言,本文通过实际案例和详细步骤,为读者提供了解决订单数据持续增长导致数据库性能下降问题的有效方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端存储实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(41)

  • 最新
  • 精选
  • 李玥
    置顶
    Hi,我是李玥。 这里回顾一下上节课的思考题: 课后请你想一下,复制状态机除了用于数据库的备份和复制以外,在计算机技术领域,还有哪些地方也用到了复制状态机?欢迎你在留言区与我讨论。感谢你的阅读,如果你觉得今天的内容对你有帮助,也欢迎把它分享给你的朋友。 复制状态机的应用是非常广泛的,比如说现在很火的区块链技术,也是借鉴了复制状态机理论,它的链,或者说是账本就是操作日志,每个人的钱包,就是状态。它只要保证账本一旦记录后就不会被篡改,那在任何人的电脑上,计算出来的钱包就都是一样的。
    2020-03-30
    31
  • 约书亚
    如果不进行OPTIMIZE,想通过历史表来提升性能的目的岂不是达不到了?

    作者回复: 不执行OPTIMIZE也是可以提升性能的。数据和索引虽然在物理上没有删除,但逻辑上已经删除掉了,执行查询操作的时候,并不会去访问这些已经删除的数据。 比如,原来有100条数据,删除完成后剩了10条。虽然100条数据都在磁盘文件中,但这时候执行一次全表扫描,MySQL只会访问剩下的10条数据。

    2020-03-28
    3
    33
  • AI
    一下子和Java的GC算法产生了共鸣。 创建新表的方式,只复制少部分数据,效率更高,但你要能接受这段时间的STW。这是复制算法。 历史归档,删除数据的方式,会产生碎片,利用率低。只有到空间不足的情况下,才进行压缩整理(OPTIMIZE)。这是标记清理算法,关键时刻再整理(STW),CMS GC就是这个思路。

    作者回复: 是的,磁盘碎片和内存碎片产生的原因是一样的,所以清理的思路很多都是相似的。

    2020-04-27
    3
    32
  • 刘楠
    alter table A engine=InnoDB 命令来重建这样也能达到释放空间的效果吧

    作者回复: 是可以的。

    2020-03-28
    6
    11
  • 乖,摸摸头
    按时间分库分表一直有个疑惑, 按月进行分表, 有几个月数据很小,有几个月数据特别大,这种会怎么处理

    作者回复: 这种情况可能就不适合按月来分片。

    2020-05-12
    8
  • 老师,什么情况下需要归档,什么情况需要分库分表呢?有什么具体的指标吗?

    作者回复: 我个人的建议是,如果归档能解决问题,就不要分库分表。我们下节课会详细讲讲分库分表。

    2020-03-28
    2
    5
  • 怀朔
    比这个删除规律 是不是有问题啊? 1、创建temp表 2、把历史数据迁移老表 3、check历史数据条数 4、删除老数据? 按照老师的方法 在rename 之前 插入之后 这时候有数据进来 数据会丢在老表里面了?

    作者回复: 所以我们说,这个方案的前提是必须得停机操作。

    2020-03-28
    3
    4
  • lesserror
    老师,您的这句话:“其实每次都排序是没必要的,所以我们可以先通过一次查询,找到符合条件的历史订单中最大的那个订单 ID,然后在删除语句中把删除的条件转换成按主键删除。” 事实上每次,都做了排序啊?为什么说没必要呢?

    作者回复: 这个地方改为:“其实没有必要每次都按照timestamp比较订单”。我联系编辑小姐姐修改,感谢你的问题!

    2020-05-24
    2
  • 特种流氓
    最近的订单表往归档表挪数据的过程中可能一份数据在两张表都存在 这个时候用户查询全部订单的时候是否我们在应用利用是用去重去剔除重复数据

    作者回复: 如果要同时查二个表,那合并和去重就在所难免。一般情况下,最好能设计好业务逻辑,尽量不要同时查当前和历史表。

    2020-03-29
    2
  • Panmax
    最后一种方案中(重建一张新的订单表),最后不应该把 orders_to_be_droppd 表删掉吧,删掉之后历史数据就丢了。

    作者回复: 这个可以灵活处理。

    2020-04-02
    1
收起评论
显示
设置
留言
41
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部