分库分表的方式
Posted 保暖大裤衩LeoLee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分库分表的方式相关的知识,希望对你有一定的参考价值。
垂直切分
垂直分表
将某张表中的字段,按照某种业务特征划分,将不同业务特征的字段放入同一张表中,将该表拆分为若干张表,就是垂直分表。
从某种层面来看,这就是数据库表设计层面上的逻辑拆分。
垂直分库
将不同业务特征的表,按照业务特征进行划分,不同业务特征的表放入不同的数据库中。
简单的来讲就是订单相关的表放入订单数据库,产品相关的表放入产品数据库中。
水平切分
水平切分是为了解决单表数据量过大的问题,将单表数据量过大的查询压力分散。
水平分表
将一张表中数据拆分为若干段,分别存入相同表结构的其他表中。这些表为数据的实际存储表,而这些表加起来为该表的逻辑主表。
水平分库
将一张表中数据拆分为若干段,分别存入不同数据库中的相同表结构的表中。
分库分表带来的问题
分库分表后,虽然从数据库数据容量或者是单表的数据库容量层面看,有了显著的下降,但是带来了数据操作的困难。
- 查询某一条数据,需要到每一个数据库中都检索,根据所有数据库的检索的综合结果来返回查询结果。
- 关联查询,可能关联查询的两张表不在同一个数据库,就产生了跨库查询,通过查询每个库中的数据之后,在代码中关联起来会很复杂,冗余,代码入侵太强了。
- 分页或者是排序,无法单独对数据在同一个库的同一张表中进行分页或者排序,需要查询所有库的数据,对综合起来的结果进行分页或者排序。
- 系统复杂度变高,运维难度增大。
解决方案:
- 通过spring中的AbstractRoutingDataSource,对多数据源进行操作,在代码层面解决跨库操作带来的问题。业务入侵大,代码量上升。
- 在持久层框架使用插件,对sql进行拦截,按照既定规则进行sql路由等行为。
- 驱动层进行代理,shardingJDBC
- 系统之外的代理层,单独部署,如Mycat,在应用层就可以把Mycat看作是一个多数据源的一个代理。
以上是关于分库分表的方式的主要内容,如果未能解决你的问题,请参考以下文章