专栏首页架构师之路数据库究竟该怎么垂直拆?

数据库究竟该怎么垂直拆?

缘起上周,有水友问我说:

都知道业务垂直拆分,数据库要怎么垂直拆分呢?

今天,简单聊聊数据库垂直拆分。

什么是数据库水平切分,垂直拆分?

当数据库的数据量非常大时,水平切分和垂直拆分都是常见的降低库空间,提升库性能的方法。

太抽象,能不能举个例子?

假设有用户表:

user(

uid bigint,

name varchar(16),

pass varchar(16),

age int,

sex tinyint,

flag tinyint,

sign varchar(64),

intro varchar(256)

…);

什么是水平切分?

以某个字段为依据(例如uid),按照一定规则(例如取模),将一个库(表)上的数据拆分到多个库(表)中,以降低单库(表)大小,达到提升性能的目的的方法。

水平切分后,各个库(表)有什么特点?

(1)每个库(表)的结构都一样;

(2)每个库(表)的数据都不一样,没有交集;

(3)所有库(表)的并集是全量数据;

什么是垂直拆分?

垂直拆分是指,将一个属性较多,一行数据较大的表,将不同的属性拆分到不同的库(表)中,以降低单库(表)大小,达到提升性能的目的的方法。

垂直拆分后,各个库(表)有什么特点?

(1)每个库(表)的结构都不一样;

(2)每个库(表)的属性至少有一列交集,一般是主键;

(3)所有库(表)的并集是全量数据;

以上文提到的用户表为例,垂直拆分结果可能是这样的:

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)将字段较长,访问频率较低的属性尽量放在一个表里,这个表暂且称为扩展表;

(3)经常一起访问的属性,也可以放在一个表里;

画外音:优先考虑1和2。

另,如果属性过多,可以有多个扩展表。

画外音:一般来说,只有1个主表。

为何要将字段短,访问频率高的属性放到一个表内?

为何这么垂直拆分可以提升性能?

(1)数据库有自己的内存缓冲池,会将磁盘上的数据load到缓冲池里;

画外音:详见《数据库缓冲池,这次彻底懂了!》。

(2)数据库缓冲池,以row为单位缓存数据;

(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)垂直拆分的依据,尽量把长度较短,访问频率较高的属性放在主表里;

本文分享自微信公众号 - 架构师之路(road5858),作者:58沈剑

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一分钟掌握数据库垂直拆分

    一、缘起 当数据库的数据量非常大时,水平切分和垂直拆分是两种常见的降低数据库大小,提升性能的方法。假设有用户表: user( uid bigint, name ...

    架构师之路
  • 带团队,投票真的公平吗?

    N年前的一个年末,到了公司发奖评优开年会的时间。技术部也不例外,要评年度优秀员工,分到wutp的部门也就差不多一个名额。 画外音:wutp是我leader,负责...

    架构师之路
  • 数据库中间件Atlas调研笔记

    前篇: 《假如让你来设计数据库中间件》 《数据库中间件TDDL调研笔记》 《数据库中间件cobar调研笔记》 《数据库中间件mysql-proxy调研笔记》 1...

    架构师之路
  • Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结

    我是十三
  • 在Visual Sutdio 2017中使用boost库

    对C++有一定了解的同学一定听说过boost库,这是C++的一个著名类库,在C++的地位感觉可以和Spring在Java中相比。boost向来有准标准库之称,很...

    乐百川
  • 【Sqoop】数据转换工具Sqoop

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    魏晓蕾
  • Selenium WebDriver使用IE浏览器

    IEdriver插件下载地址:http://www.cr173.com/soft/195732.html

    周小董
  • Python中ImportError:

    Python脚本在编译的时候,经常会遇到ImportError: No module named *** 的错误 错误提示: ImportError: No m...

    py3study
  • 诺基亚联手Vodafone,将于明年在月球上部署4G网络 | 热点

    镁客网
  • Vivado设计锁定与增量编译(附工程)

    该部分引用本公众号上一篇时序约束文章中的内容,在Quartus中采用逻辑锁定的办法来解决FPGA和外部接口的时序问题,也就是输入输出的寄存Rxd/Txd的寄存器...

    网络交换FPGA

扫码关注云+社区

领取腾讯云代金券