数据库优化 -水平拆分与垂直拆分
垂直拆分
垂直拆分是根据数据库里面的数据表的相关性进行拆分。
例:一个数据库里面存放着用户数据(用户表),又存储订单数据(订单表),那么使用垂直分库可以把用户数据放到用户库、把订单数据放到订单库。垂直分表是对数据表进行垂直拆分的一种方式,常用于把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联
例子
User表
垂直拆分
User表
Class表
垂直拆分的优点是:
(1)可以使得行数据变小,一个数据块(Block)就能存放更多的数据,在查询时就会减少I/O次数(每次查询时读取的Block 就少);
(2)可以达到最大化利用Cache的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起;
(3)数据维护简单。
垂直拆分的缺点是:
(1)主键出现冗余,需要管理冗余列;
(2)会引起表连接JOIN操作(增加CPU开销);
(3)不能解决单表数据量过大的问题**(需要水平拆分)**
(4)事务处理复杂。
水平拆分
水平拆分是通过某种策略将数据分片来存储,分库内分表和分库两部分,每片数据会分散到不同的MySQL表或库,达到分布式的效果,能够支持非常大的数据量。前面的表分区本质上也是一种特殊的库内分表。
库内分表,仅仅是单纯的解决了单一表数据过大的问题,由于没有把表的数据分布到不同的机器上,因此对于减轻MySQL服务器的压力来说,并没有太大的作用,大家还是竞争同一个物理机上的IO、CPU、网络,这个就要通过分库来解决。
例子
Employee表
水平拆分
Employee_A表
Employee_B表
水平拆分的优点是:
(1)不存在单库大数据和高并发的性能瓶颈;
(2)应用端改造较少;
(3)提高了系统的稳定性和负载能力。
水平拆分的缺点是:
(1)分片事务一致性难以解决;
(2)跨节点Join性能差,逻辑复杂;
(3)数据多次扩展难度跟维护量极大。