2020-07-28
分类:架构师必读
阅读(367) 评论(0)
当数据库的数据量非常大时,水平切分和垂直拆分都是常见的降低库空间,提升库性能的方法。
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)垂直拆分的依据,尽量把长度较短,访问频率较高的属性放在主表里;
版权归原创作者所有,任何形式转载请联系作者;
码农code之路 »
数据库究竟该怎么垂直拆?
觉得文章有用就打赏一下文章作者
支付宝扫一扫打赏
微信扫一扫打赏