分库分表

1、为什么要分库分表

当一张表的数据达到几千万时,查询一次所花的时间会变长。这时候,如果有联合查询的话,可能会卡死在那儿,甚至把系统给拖垮。

而分库分表的目的就在于此:减小数据库的负担,提高数据库的效率,缩短查询时间。另外,因为分库分表这种改造是可控的,底层还是基于RDBMS,因此整个数据库的运维体系以及相关基础设施都是可重用的。去中心化。

2、分库分表的手段有哪些?

1)垂直分表,按照业务,比如一张user表,userbase表做登录用,userinfo表做个人信息修改用

 2)垂直分库,按照业务来,订单信息都在一个库,用户信息都在一个库,商品信息都在一个库

 垂直拆分的特点:每个库每个表的结构都不一样;每个库每个表的数据至少一列一样;每个库每个表的并集是全量数据。

优点:拆分后业务清晰,数据维护简单,按照不同业务放到不同的机器上。

缺点:

一:如果的单表的数据量大,那么单表的读写压力依然比较大。

二:受某种业务的影响到库的瓶颈,比如双11,订单业务会大量新增,其他会员库和商品库查找多

三:部分业务无法直接关联join,只能通过java接口去调用,提供了开发的复杂度。比如双11订单表上面商品价格是20元,

然后过了双11商品表的价格是25,我们查订单信息不能直接join。

3)水平分表:将id通过运算,哈希,把数据分散在不同表。比如奇数id放在user1表,偶数id放在user2表。

 4)水平分库:将id通过运算,哈希,把数据分散在不同库。比如奇数id放在user1表,偶数id放在user2表。

 水平拆分特点:每个库(表)的结构都一样;每个库(表)的数据都不一样;每个库(表)并集是全部数据。

优点:一、单表的数据保有量减少,有助于性能的提高。

二、提高了系统的稳定性和负载能力。

三、拆分表的结构相同,程序代码改动的较少

缺点:一、数据扩容再新增库难度大

二、拆分规则很难抽象出来

三、分片事务的一致性问题部分业务无法关联join,只能通过java程序去调用。

 3、分库分表带来的问题

1)分布式事务一致性,传统的acid

2)分布式全局唯一id

3)跨库join查询

4)开发成本大,对程序员要求高。

开源框架:

jdbc直连层:

  shardingsphere.tddl

proxy代理层:可以跨语言

  mycat、mysql-proxy(360)

 

原文地址:https://www.cnblogs.com/wenwenzuiniucha/p/15032109.html