数据局分库分表设计思想
1、分库的优点
数据库涉及到将数据从硬盘读取到内存当中,这一步在目前计算机所有常用的调度之中,可以说是最耗费时间的。同时,对于大数据的处理,往往也是在这里最容易出现性能方面的问题。主要存在如下几个方面的问题:
1、数据库连接数的问题
Mysql默认的最大连接数为100.这个连接连接数可以修改,而mysql服务允许的最大连接数为16384,常见的报错 ’too many connections‘
2、数据访问压力
单一数据库的访问压力是有一定的限度的。
3、Mysql的读写机制
Mysql具有读写分离的机制,写操作都对应到Master,读操作可以在 Master和Slave机器上进行,Slave可以认为是Master的子节点,并且Slave下也可以有 Slave,如此便可以提高整个系统的读写速度。
写操作都是先在Master上操作,然后同步更新到Slave上,从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。在读压力比较大的情况下,增加Slave是可以在一定程度上解决的,但是Slave也不能无限增加,还有成本的问题,所以还是需要进行分库。
2、分表的优势
1、单个表数据的维护量减少
2、对于程序的改动也可以减少,后期增加需求时,对于代码的改动程度也可以减少。
3、可以将经常需要修改的数据和经常不使用的数据分离开来,从而平衡数据库表的访问次数,进而降低数据的压力。
4、后台业务逻辑也会更加清晰,减少后端编码的工作量。
3、mysql分库分表的具体方法
首先可以认为分库就是大型的分表的方法,而分表就是小型分库方法。所以,这里可认为二者的方法相同。
1、RANGE(一般使用比较少)
所谓RANGE就是根据数据的范围进行进行分库分表,比如说数据在10w以下的可以放在一张表中,在10w以上的放在另外的表中,不过这样的话就需要记录对应不同表的id,可以采用一个路由表的方式
2、Hash算法
userId.hascode()%n
n为数据库中的数量或者表的数量。
优点: 能保证数据较均匀的分散落在不同的库、表中,减轻了数据库压力。
缺点: 扩容麻烦、迁移数据时每次都需要重新计算hash值分配到不同的库和表。
3、一致性hash算法
一直性hash算法是在hash算法的基础上,将数据库通过hash映射到hash环上,当某个节点失效时,后面可以将其移动到最近的节点上。参考下面这篇文章,介绍的非常详细。https://segmentfault.com/a/1190000021199728