1. 水平分表
(1) 什么是水平分表
水平分表就是指以行为单位对数据进行拆分,一般意义上的分库分表指的就是水平分表。
分表之后,所有表的结构都是一样的。
(2) 为什么要水平分表
水平分表可以解决一个表数据量太大的问题,如果一张表的数据太多,会对性能造成影响。
(3) 如何进行水平分表
【水平分表和垂直分表】一般可以有范围法和hash法来进行水平分表。
假设现在有3万行数据,需要对它们进行水平分表(当然一般3万行不用分哈):
范围法很好理解,可以让第1~10000行数据存放在表1,第10001~20000行数据存放在表2,第20001~30000行数据存放在表3,就完成了水平分表。
hash法也不难理解,就是选择一个合适的hash函数,比如说使用取模操作(%),把%3结果为0的数据存放在表1,结果为1的存放在表2,结果为2的存放在表3即可。
2. 垂直分表
(1) 什么是垂直分表
垂直分表就是把一张表按列分为多张表,多张表通过主键进行关联,从而组成完整的数据。
分表之后,每张表的结构都不相同。
(2) 为什么要垂直分表
这主要跟某些数据库的引擎有关,比如Mysql的InnoDB引擎。
在Mysql中,数据的基本单位,称为 行 (Row)一个区由连续的页组成,一个页由连续的行组成
管理数据的基本单位,称为 页 (Page)
保存页的单位,称为 区 (Extent)
默认每一个区的大小为1M,默认每一页的大小为16K,所以一个区有1024 / 16 = 64个页
而每个页中,根据每行数据的大小,又可以存储多个行
然而,在InnoDB 1.0版本之后,引入了一个新特性:压缩页
被压缩之后的页在实际占用空间上,比逻辑上的要小,但是在压缩和解压缩时会花费额外的时间
这时如果出现了跨页检索数据,效率就会比较低
因此,在表设计时,尽可能的在页内多存储数据行,这样可以减少跨页检索,提高效率。
而多存储数据行就意味着,每一行的列数要尽可能少。
(3) 如何进行垂直分表
既然要求每一行的列数尽可能少,那直接每个表就只存储一两列行不行?
当然不行!
这样做不仅会造成表过多,而且会产生大量重复字段(比如主键),在查询时还需要不断地进行多表关联
所以,如何进行垂直分表还是有技巧的。
一般来说,垂直分表并不会把列平分到2个表中,而是会将一些重要的字段单独剥离成小表,把剩余的不太重要的字段放在大表中。
比如,把查询、排序时需要的字段,高频访问的小字段放在小表
而把低频访问字段以及一些大字段放在大表中
参考鸣谢 为什么要垂直分表:https://www.bilibili.com/vide...