数据库水平拆分和垂直拆分
案例:
简单购物系统暂设涉及如下表:
1. 产品表(数据量10w,稳定)
2. 订单表(数据量200w,且有增长趋势)
3. 用户表 (数据量100w,且有增长趋势
以mysql为例讲述下水平拆分和垂直拆分,
mysql能容忍的数量级在百万静态数据可以到千万
垂直拆分:
解决问题:
表与表之间的io竞争
不解决问题:
单表中数据量增长出现的压力
方案:
把产品表和用户表放到一个server上
订单表单独放到一个server上
水平拆分:
解决问题:
单表中数据量增长出现的压力
不解决问题:
表与表之间的io争夺
方案:
1.用户表通过性别拆分为男用户表和女用户表
2.订单表通过已完成和完成中拆分为已完成订单和未完成订单
3.产品表 未完成订单放一个server上
4.已完成订单表盒男用户表放一个server上
5.女用户表放一个server上
表的水平分割和垂直分割
水平分割:
例:QQ的登录表。
假设QQ的用户有100亿,如果只有一张表,
每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢。
如果将这一张表分成100份,每张表有1亿条,就小了很多,
比如qq0,qq1,qq1...qq99表。
用户登录的时候,可以将用户的id0,那么会得到0-99的数,
查询表的时候,将表名qq跟取模的数连接起来,就构建了表名。
比如123456789用户,取模的89,
那么就到qq89表查询,查询的时间将会大大缩短。
垂直分割:
垂直分割指的是:表的记录并不多,但是字段却很长,表占用空间很大,
检索表的时候需要执行大量的IO,严重降低了性能。
这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
例如学生答题表tt:有如下字段:
Id name 分数 题目 回答
其中题目和回答是比较大的字段,id name 分数比较小。
如果我们只想查询id为8的学生的分数:
select 分数 from tt where id =8;
虽然知识查询分数,但是题目和回答这两个大字段也是要被扫描的,很消耗性能。
但是我们只关心分数,并不想查询题目和回答。这就可以使用垂直分割。
我们可以把题目单独放到一张表中,通过id与tt表建立一对一的关系,
同样将回答单独放到一张表中。
这样我们插叙tt中的分数的时候就不会扫描题目和回答了。