IO问题:
磁盘读IO瓶颈:热点数据太多,数据库缓存放不下 -> 分库和垂直分表
网络IO瓶颈:请求数据太多,网络带宽不够 -> 分库
cpu问题:
SQL问题:SQL中包含join group by order by 非索引字段查询,增加cpu运算的操作->SQL优化
单表数据量太大,SQL效率低,cpu先出现瓶颈->水平分表
水平分库:
以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。
特点:每个库结构相同,数据不同,没有交集。
系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。
分析:库多了,io和cpu的压力自然可以成倍缓解。
水平分表:
以字段为依据,按照一定策略(hash、range),将一个表中的数据拆分到多个表中。
特点:表结构相同,数据不同,没有交集。
系统绝对并发量并没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。
分析:表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。
垂直分库:
以表为依据,按照业务归属不同,将不同的表拆分到不同的库中
每个库的结构不一样,数据不同,没有交集
分析:随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。
垂直分表:
操作数据库中某张表,把这张表中一部分字段数据存到一张新表里面,再把这张表另一 部分字段数据存到另外一张表里面 。
以字段为依据,按照字段的活跃性,将表中字段拆分到不同的表(主表和扩展表)中。
表的结构不同,数据不同
分析:不能使用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务Service层,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。
端上除了partition key只有一个非partition key作为条件查询
扩容问题:
注: 双写是通用方案。