数据库究竟该怎么垂直拆?
当数据库的数据量非常大时,水平切分和垂直拆分都是常见的降低库空间,提升库性能的方法。user(
uid bigint,
name varchar(16),
pass varchar(16),
age int,
sex tinyint,
flag tinyint,
sign varchar(64),
intro varchar(256)
…);
以某个字段为依据(例如uid),按照一定规则(例如取模),将一个库(表)上的数据拆分到多个库(表)中,以降低单库(表)大小,达到提升性能的目的的方法。垂直拆分是指,将一个属性较多,一行数据较大的表,将不同的属性拆分到不同的库(表)中,以降低单库(表)大小,达到提升性能的目的的方法。(2)每个库(表)的属性至少有一列交集,一般是主键;以上文提到的用户表为例,垂直拆分结果可能是这样的:user_base(
uid bigint,
name varchar(16),
pass varchar(16),
age int,
sex tinyint,
flag tinyint,
…);
user_ext(
uid bigint,
sign varchar(64),
intro varchar(256)
…);
(1)将长度较短,访问频率较高的属性尽量放在一个表里,这个表暂且称为主表;(2)将字段较长,访问频率较低的属性尽量放在一个表里,这个表暂且称为扩展表;(1)数据库有自己的内存缓冲池,会将磁盘上的数据load到缓冲池里;(3)在内存有限的情况下,在数据库缓冲池里缓存短row,就能缓存更多的数据;(4)在数据库缓冲池里缓存高频访问row,就能提升缓存命中率,减少磁盘的访问;假设数据库内存缓冲池为1G,未拆分的user表1行数据大小为1k,那么只能缓存100w行数据。如果垂直拆分成user_base和user_ext,其中:(1)user_base访问频率高,一行大小为0.1k;画外音:例如uid, name, passwd, 以及一些flag等。(2)user_ext访问频率低,一行大小为0.9k;那边缓冲池就就能缓存近乎1000w行user_base的记录,访问磁盘的概率会大大降低,数据库访问的时延会大大降低,吞吐量会大大增加。(1)水平拆分和垂直拆分都是降低数据量大小,提升数据库性能的常见手段;(2)垂直拆分的依据,尽量把长度较短,访问频率较高的属性放在主表里;