MySQL的垂直拆分和水平拆分

1 垂直拆分

垂直拆分共有两种方案:

1.1 第一种(表的业务)

方案:把不同业务的数据库表放在不同的数据库服务器上,例如:把产品表和用户表放到一个server上,订单表单独放到一个server上。
解决问题:表与表之间的io竞争。
不解决问题:单表中数据量增长出现的压力。

1.2 第二种(表的列)

方案:把原来在一个表中的字段拆分成几个表,也就是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。例如:

学生答题表tt:有如下字段:
id name 分数 题目 回答
其中题目和回答是比较大的字段,id name 分数比较小。
如果我们只想查询id为8的学生的分数:select 分数 from tt where id = 8;虽然知识查询分数,
但是题目和回答这两个大字段也是要被扫描的,很消耗性能。但是我们只关心分数,并不想查询题目和回答。
这就可以使用垂直分割。我们可以把题目单独放到一张表中,通过id与tt表建立一对一的关系,
同样将回答单独放到一张表中。这样我们插叙tt中的分数的时候就不会扫描题目和回答了。

2 水平拆分

案例1:QQ的登录表。假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢。如果将这一张表分成100份,每张表有1亿条,就小了很多,比如qq0,qq1,qq1…qq99表。

用户登录的时候,可以将用户的id%100,那么会得到0-99的数,查询表的时候,将表名qq跟取模的数连接起来,就构建了表名。比如123456789用户,取模的89,那么就到qq89表查询,查询的时间将会大大缩短。

案例2:

 简单购物系统暂设涉及如下表:

1.产品表(数据量10w,稳定)

2.订单表(数据量200w,且有增长趋势)

3.用户表 (数据量100w,且有增长趋势)

方案:

用户表通过性别拆分为男用户表和女用户表

订单表通过已完成和完成中拆分为已完成订单和未完成订单

产品表、未完成订单放一个server上

已完成订、表盒男用户表放一个server上

女用户表放一个server上(女的爱购物 哈哈)

解决问题:单表中数据量增长出现的压力

不解决问题:表与表之间的io争夺

参考:https://shardingsphere.apache.org/document/current/cn/features/sharding/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值