这四种情况下,才是考虑分库分表的时候!
来源:https://juejin.im/post/6844903992909103117
数据库瓶颈
IO瓶颈
第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询会产生大量的IO,降低查询速度->分库和垂直分表 第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 ->分库
CPU瓶颈
第一种:SQl问题:如SQL中包含join,group by, order by,非索引字段条件查询等,增加CPU运算的操作->SQL优化,建立合适的索引,在业务Service层进行业务计算。 第二种:单表数据量太大,查询时扫描的行太多,SQl效率低,增加CPU运算的操作。->水平分表。
水平分库

1、概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。 2、结果: 每个库的结构都一样 每个库中的数据不一样,没有交集 所有库的数据并集是全量数据 3、场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库的情况下。 4、分析:库多了,io和cpu的压力自然可以成倍缓解
水平分表

1、概念:以字段为依据,按照一定策略(hash、range等),讲一个表中的数据拆分到多个表中。 2、结果: 每个表的结构都一样 每个表的数据不一样,没有交集,所有表的并集是全量数据。 3、场景:系统绝对并发量没有上来,只是单表的数据量太多,影响了SQL效率,加重了CPU负担,以至于成为瓶颈,可以考虑水平分表。 4、分析:单表的数据量少了,单次执行SQL执行效率高了,自然减轻了CPU的负担。
垂直分库

1、概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。 2、结果: 每个库的结构都不一样 每个库的数据也不一样,没有交集 所有库的并集是全量数据 3、场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块的情况下。 4、分析:到这一步,基本上就可以服务化了。例如:随着业务的发展,一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再者,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。
垂直分表

1、概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表中(主表和扩展表)。 2、结果: 每个表的结构不一样。 每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据。 所有表的并集是全量数据。 3、场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大,以至于数据库缓存的数据行减少,查询时回去读磁盘数据产生大量随机读IO,产生IO瓶颈。 4、分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能经常会查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表,这样更多的热点数据就能被缓存下来,进而减少了随机读IO。拆了之后,要想获取全部数据就需要关联两个表来取数据。
分库分表工具
sharding-jdbc(当当) TSharding(蘑菇街) Atlas(奇虎360) Cobar(阿里巴巴) MyCAT(基于Cobar) Oceanus(58同城) Vitess(谷歌) 各种工具的利弊自查
分库分表带来的问题
上图只是取第一页的数据,对性能影响还不是很大。但是如果取得页数很大,情况就变得复杂的多,因为各分片节点中的数据可能是随机的,为了排序的准确性,需要将所有节点的前N页数据都排序好做合并,最后再进行整体排序,这样的操作很耗费CPU和内存资源,所以页数越大,系统性能就会越差。CREATE TABLE `sequence` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`stub` char(1) NOT NULL default '',
PRIMARY KEY (`id`),
UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM;
REPLACE INTO sequence (stub) VALUES ('a');
SELECT 1561439;

Snowflake分布式自增ID算法
Twitter的snowfalke算法解决了分布式系统生成全局ID的需求,生成64位Long型数字,组成部分:第一位未使用 接下来的41位是毫秒级时间,41位的长度可以表示69年的时间 5位datacenterId,5位workerId。10位长度最多支持部署1024个节点 最后12位是毫秒内计数,12位的计数顺序号支持每个节点每毫秒产生4096个ID序列。
数据迁移、扩容问题
什么时候考虑分库分表
能不分就不分
数据量过大,正常运维影响业务访问
随着业务发展,需要对某些字段垂直拆分
数据量快速增长
推荐阅读
分享基于 Spring Cloud +OAuth2 的权限管理系统
工作10年后,再看String s = new String("xyz") 创建了几个对象?
SpringBoot集成WebSocket,实现后台向前端推送信息
程序员该如何把 Windows 系统打造的跟 Mac 一样牛逼?
评论
