数据库分库分表

2019-03-19  本文已影响0人  喧嚣城外
为什么分库分表?(设计高并发系统时候,数据库层面该如何设计?)

分库和分表是两回事,大家别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。

分表:

就是把一个表的数据放到多个表中,然后查询的时候你就查一个表。比如按照用户id来分表,将一个用户的数据就放在一个表中。然后操作的时候你对一个用户就操作那个表就好了。这样可以控制每个表的数据量在可控的范围内,比如每个表就固定在200万以内。

分库:

就是你一个库一般我们经验而言,最多支撑到并发2000,一定要扩容了,而且一个健康的单库并发值你最好保持在每秒1000左右,不要太大。那么你可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了。


分库分表中间件,不同的分库分表中间件有什么优点和缺点?
常见的中间件:cobar、TDDL、atlas,sharding-jdbc、mycat

sharding-jdbc这种client层方案的优点在于不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,但是如果遇到升级啥的需要各个系统都重新升级版本再发布,各个系统都需要耦合sharding-jdbc的依赖。
mycat这种proxy层方案的缺点在于需要部署,自己及运维一套中间件,运维成本高,但是好处在于对于各个项目是透明的,如果遇到升级之类的在中间件那里搞就好。


如何对数据库垂直拆分或水平拆分的

水平拆分:把一个表的数据给弄到多个库的多个表中,但是每个库的表结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据,水平拆分的意义,就是将数据均匀放到更多库中,然后用多个库来抗高并发,还有就是用多个库的存储容量来进行扩容。
垂直拆分:就是把一个很多字段的表拆分成多个表,或多个库中,每个库的结构都不一样,每个库表都包含部分字段,一般来说,将较少的访问频率很高字段放在一个表,然后将较多的访问频率很低的字段放到另外一个表中,因为数据库是有缓存的,你访问频率高的行字段越少,就可以在缓存里缓存更多行,性能就越好,这个一般在表层面做的较多。

两种分表分库方式(range&hash)
01_分库分表的由来.png 02_数据库如何拆分.png
上一篇 下一篇

猜你喜欢

热点阅读