分库分表的方式

Posted 保暖大裤衩LeoLee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分库分表的方式相关的知识,希望对你有一定的参考价值。

垂直切分

垂直分表

将某张表中的字段,按照某种业务特征划分,将不同业务特征的字段放入同一张表中,将该表拆分为若干张表,就是垂直分表

从某种层面来看,这就是数据库表设计层面上的逻辑拆分

垂直分库

将不同业务特征的表,按照业务特征进行划分,不同业务特征的表放入不同的数据库中

简单的来讲就是订单相关的表放入订单数据库,产品相关的表放入产品数据库中。

水平切分

水平切分是为了解决单表数据量过大的问题,将单表数据量过大的查询压力分散。

水平分表

将一张表中数据拆分为若干段,分别存入相同表结构的其他表中。这些表为数据的实际存储表,而这些表加起来为该表的逻辑主表。

水平分库

将一张表中数据拆分为若干段,分别存入不同数据库中的相同表结构的表中。

分库分表带来的问题

分库分表后,虽然从数据库数据容量或者是单表的数据库容量层面看,有了显著的下降,但是带来了数据操作的困难。

  1. 查询某一条数据,需要到每一个数据库中都检索,根据所有数据库的检索的综合结果来返回查询结果。
  2. 关联查询,可能关联查询的两张表不在同一个数据库,就产生了跨库查询,通过查询每个库中的数据之后,在代码中关联起来会很复杂,冗余,代码入侵太强了。
  3. 分页或者是排序,无法单独对数据在同一个库的同一张表中进行分页或者排序,需要查询所有库的数据,对综合起来的结果进行分页或者排序。
  4. 系统复杂度变高,运维难度增大。

解决方案:

  1. 通过spring中的AbstractRoutingDataSource,对多数据源进行操作,在代码层面解决跨库操作带来的问题。业务入侵大,代码量上升。
  2. 在持久层框架使用插件,对sql进行拦截,按照既定规则进行sql路由等行为。
  3. 驱动层进行代理,shardingJDBC
  4. 系统之外的代理层,单独部署,如Mycat,在应用层就可以把Mycat看作是一个多数据源的一个代理。

 

以上是关于分库分表的方式的主要内容,如果未能解决你的问题,请参考以下文章

.netcore分库分表的问题

利用ShardingSphere-JDBC实现分库分表

DB 分库分表:关于使用框架还是自主开发以及 sharding 实现层面的考量

MySQL横向扩展-分库分表解决方案总结

数据库分库分表

分库 分表