• 百亿数据分库分表核心流程详解


    前言

    俗话说:面试造火箭,入职拧螺丝。尽管99.99%的业务都不需要用到分库分表,但是分库分表还是频繁出现在大厂的面试中。

    分库分表涉及到的内容非常多,有很多细节,如果在面试中被问到了,既是挑战,也是机会,如果你能回答好的话,会给你的面试加很多分。

    由于业务量的关系,绝大部分同学都很难有实际分库分表的机会,因此很多同学在碰到这个问题时很容易懵逼。

    因此今天跟大家分享一下分库分表的相关知识,本文内容源于实际高并发+海量数据业务下的实战和个人的思考总结。

    什么是分库分表

    分表

    分表指的是在数据库数量不变的情况下,对数据库里面的表进行拆分。

    例如我们将SPU表从一张拆成四张。

    分库

    分库指的是在表数量不变的情况下对数据库进行拆分。

    例如我们本来有一个库里面放了两张表,一张是SPU表,一张是SKU表。我们将这两张表拆到两个不同的库里面去。

    分库分表

    也就是数据库的数量,还有表的数量都发生变更。

    例如我们有一个数据库里面本来有一张SPU表。我们将这个SPU表拆成四张表,并且放在两个数据库里面。

    拆分方式

    当前主要的拆分方式有两种:水平拆分和垂直拆分。

    水平拆分就是从左往右横着切,垂直拆分就是从上往下竖着切。当然具体切几刀,这个要看具体的业务需求。

    水平拆分

    水平拆分指的是在整个表数据结构不发生变更的情况下,将一张表的数据拆分成多张表。因为当单张表的数据量越来越大时,这张表的查询跟写入性能也会相应的变得越来越慢。

    因此这个时候我们可以将单张表拆分成多张表,从而让每张表的数据量都变小,从而可以提供更好的读写性能。

    垂直拆分

    垂直拆分指的是将本来放在一张表的字段拆分到多张表中。

    例如在这个例子中,我们将pic这个字段单独拆分出来,然后剩下的三个字段还保留在原表里面。

    这种场景主要是因为在业务的初期,为了业务的快速发展,我们将商品的所有字段都放在一张表里面。但是随着后面的业务的发展,我们发现这个pic字段可能变得越来越大,从而影响到我们商品的基本信息的查询性能。因此这个时候我们可以将这个pic字段单独拆分出去。

    当然这个pic字段拆分出去之后,它应该要存储这个原来这个商品的这个id。

    为什么需要分库分表

    因为单台MySQL服务器的硬件资源是有限的,随着业务的不断发展,请求量和数据量会不断增加,数据库的压力会越来越大,到了某一时刻,数据库的读写性能可能会开始下降,这个时候数据库就成为请求链路中的瓶颈。

    此时可能就需要我们去对数据库进行优化,业务初期我们可能会使用增加索引、优化索引、读写分离、增加从库等手段来进行优化,但是随着数据量的不断增大,这些优化手段的效果会变得越来越小,此时可能就需要使用分库分表来进行优化,对数据进行切分,将单库和单表的数据量控制在合理的范围内,以保证数据库可以提供高效的读写能力。

    何时需要分库分表

    总体来说:当性能出现瓶颈,并且其他优化手段无法很好的解决的时候。

    我们这边必须首先明确分库分表一般是作为最终的解决手段,我们会优先使用其他的方法来进行优化。常见的优化手段有增加索引、优化索引、读写分离、增加数据库的从库等等。当我们使用这些手段都无法解决的时候,就需要来考虑分库分表。

    单表出现瓶颈:

    • 单表数据量较大,导致读写性能较慢。

    单库出现瓶颈:

    • CPU压力过大(busy、load过高),导致读写性能较慢。

    • 内存不足(缓存池命中率较低、磁盘读写IOPS过高),导致读写性能较慢。

    • 磁盘空间不足,导致无法正常写入数据。

    • 网络带宽不足,导致读写性能较慢。

    单表超过千万级,就需要进行分库分表?

    这种说法不完全准确。因为有的表它本身的结构比较简单,字段也比较少。这种表可能即使数据量已经超过了亿级,整体的读写性能也是比较高的。而有的表如果整体的结构比较复杂,字段本身也比较大,可能只是百万级,整体的性能已经比较慢了。所以这个还是得结合自己的业务情况来进行分析。这个千万级只能是作为一个参考。

    如何选择分库分表

    只分表:

    • 单表数据量较大,单表读写性能出现瓶颈。

    • 经过评估单库的容量和性能可以支撑未来几年的增长。

    只分库:

    • 数据库(读)写压力较大,数据库出现存储性能瓶颈。

    分库分表:

    • 单表数据量较大,单表读写性能出现瓶颈。

    • 数据库(读)写压力较大,数据库出现存储性能瓶颈。

    注意点:

    我们在进行选择的时候&#x

  • 相关阅读:
    毛玻璃动画交互效果
    【数据结构】堆综合的运用
    哲学家和程序员眼中的web3:密码学、分布式与博弈论
    高级前端手写面试题
    背包问题学习笔记-01背包
    js_DOM中获取节点的几种方法总结
    elementui 实现树形控件单选
    C++线程池
    606. 根据二叉树创建字符串
    深度学习:到底怎么理解embedding
  • 原文地址:https://blog.csdn.net/m0_73311735/article/details/127106626