① 从连接数来看,根据官方文档,5.1.17以上版本,单台mysql数据库的连接数默认是151,上限为10w,虽然可以在上限范围内人为的设置最大连接数,或者建立连接池进行一定程度优化,但单台数据库的性能总是有瓶颈的,当请求量过大的时候,若连接数不够,则会处于阻塞状态
② 从硬件方面来看,服务器的内存、磁盘、网络等资源也是有限的,若所有数据都挤在一台服务器里面很容易造成磁盘空间不足,网络请求时间长等问题,虽然可以提升硬件性能,但是会加大成本。
③ 从查询效率来看,一张表如果没有控制数据量大小,在查询的时候会导致查询时间过长,如果还没有命中索引,那时间就更长了。
④ 在读写分离中,一台master数据库下可以挂多个slave数据库,master主要用来写数据,然后同步到各台slave,slave主要用来读数据,这样可以提高QPS。但由于写只是在master进行,当写操作过多的时候,会影响到master的稳定性,若master挂了,slave也跟着挂。所以此时master就有分库的必要,若只是读的压力大,则可以考虑添加slave数据库。
⑤ 从业务方面来看,随着业务的不断扩大,服务也要由以前的单体服务进化为微服务,数据库自然也要增加,不可能永远只用一个数据库。
分库可以减轻单库的访问压力,提高稳定性,在高并发访问的时候可以增大连接负载,提升查询效率
分表可以解决单表存储量过大,查询效率低下的问题,降低锁表概率
会增加跨表或跨库联合查询复杂度
需要引入分布式事务,复杂度增加了,对于性能有影响
跨库join困难
在不同库表查到数据后还要再应用层聚合,容易造成合并困难
比如水平分表分库会造成字段冗余
order by、limit 等操作困难度增加
垂直分库一般是根据业务来划分,比如一个系统分成很多个模块,有日志模块、用户模块、产品模块、工厂模块、物料模块等等,每个模块占用一个数据库,这些不同数据库可以分散放在不同的服务器,也可以全都放在一个服务器,这得看具体的业务和硬件性能
水平分库是指把一个数据库分成多个数据库,这些数据库的数据库表结构相同,主要目的是为了避免集中访问单个数据库,缓解单机数据库的瓶颈和压力。
垂直分表主要指把一张表中的字段分开组成独立的表,用某个相同的字段把这些表关联起来,划分依据可以如下:
① 若某个字段存储的信息占用空间大,可以把这个字段用一张表独立出去
② 可以依据字段的访问频繁度把字段独立到新表,因为频繁查表容易导致锁表,会影响到其它查询不频繁的字段
③ 单表中的字段太多,也可以考虑垂直分表
④ ……
水平分表不用拆字段,而是新建字段一样的表,根据各种划分方法把数据分别放在不同表中,划分依据可以如下:
① 可以根据时间水平分表,比如按年、月,往往最近一两年的数据访问频繁,为热数据,前几年的访问较少,为冷数据,分表可以实现冷热数据的分离
② 根据不同业务有选择性的划分
③ 根据不同算法,比如哈希计算id,自动路由到不同表
④ ……