2021-04-22 07:41:35
大厂分库分表主要通过垂直切分和水平切分两种方式实现,结合数据定位策略和中间件工具解决数据分布与查询问题。具体如下:
一、分库分表的核心目的当单表数据量超过千万级别时,即使优化索引和添加从库,数据库性能仍会显著下降。分库分表通过将数据分散到多个数据库中,减少单库单表的数据量,从而提升数据库的响应速度和整体性能。
二、分库分表的具体方式1. 垂直切分垂直切分分为垂直分库和垂直分表两种:
垂直分库:
依据:按照业务分类进行划分,每个业务拥有独立的数据库。
示例:电商系统中,用户库、订单库、商品库等分别独立存储。
优点:业务间解耦,便于独立维护、监控和扩展;高并发场景下缓解数据库压力。
缺点:开发复杂度增加,需通过接口聚合数据;分布式事务管理难度提升;未解决单表数据量过大的问题,需配合水平切分。
垂直分表:
依据:以数据表的列为依据进行切分,将大表拆分为小表。
示例:将order表中访问不频繁的长字段(如describe)拆分到work_extend表。
优点:核心表字段访问频率高且长度短,可加载更多数据到内存,减少磁盘IO,提升性能。
缺点:同垂直分库,需配合水平切分解决单表数据量问题。
当垂直切分无法解决单表数据量过大时,需配合水平切分:
示例:2000万数据的order表切分为order_1、order_2、order_3、order_4,每表500万数据。
库内分表:子表在同一数据库实例中,解决单表数据量问题,但未分布到不同物理机,仍竞争资源。
分库分表:子表分散到不同数据库,实现分布式效果。
分库分表后,需解决数据存储位置问题,常见策略包括:
1. 按取值范围切分示例:用户表按userId范围切分,第一个库存1~9999,第二个库存10000~20000,依此类推。
示例:对userId取模,余数为0存第一个库,余数为1存第二个库,依此类推。
使用XA协议和两阶段提交,但性能较差且开发量大。
采用最终一致性方案,如事务补偿机制,允许在一段时间内达到最终一致。
若排序字段是分片字段,通过分片规则定位数据。
若排序字段非分片字段,需在各分片节点排序后汇总结果,再二次排序返回。
大厂通常使用成熟的中间件实现分库分表,减少开发工作量,常见工具包括:
这些工具提供了数据分片、路由、事务管理等功能,帮助开发者高效实现分库分表。