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

2023-10-27

转自:2016-12-20 58沈剑 

一、缘起

当数据库的数据量非常大时,水平切分垂直拆分是两种常见的降低数据库大小,提升性能的方法。假设有用户表:

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

如果12都满足,还可以考虑第三点:

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

优先考虑12,第3点不是必须。另,如果实在属性过多,主表和扩展表都可以有多个。

 

一般来说,数据量并发量比较大时,数据库的上层都会有一个服务层。需要注意的是,当应用方需要同时访问主表和扩展表中的属性时,服务层不要使用join来连表访问,而应该分两次进行查询


原因是,大数据高并发互联网场景下,一般来说,吞吐量和扩展性主要矛盾

1join更消损耗数据库性能

2join会让base表和ext耦合在一起(必须在一个数据库实例上),不利于数据量大时拆分到不同的数据库实例上(机器上)。毕竟减少数据量,提升性能才是垂直拆分的初衷。

 

四、为什么要这么这么拆分

为何要将字段短,访问频率高的属性放到一个表内?为何这么垂直拆分可以提升性能?因为:

1)数据库有自己的内存buffer,会将磁盘上的数据load到内存buffer里(暂且理解为进程内缓存吧)

2内存buffer缓存数据是row为单位

3)在内存有限的情况下,在数据库内存buffer缓存短row,就能缓存更多的数据

4)在数据库内存buffer缓存访问频率高的row,就能提升缓存命中率,减少磁盘的访问

 

举个例子就很好理解了:

假设数据库内存buffer1G,未拆分的user1行数据大小为1k,那么只能缓存100w行数据。

如果垂直拆分成user_baseuser_ext,其中:

1user_base访问频率高(例如uidnamepasswd, 以及一些flag等),一行大小为0.1k

2user_ext访问频率低(例如签名, 个人介绍等),一行大小为0.9k

那边内存buffer就就能缓存近乎1000wuser_base的记录,访问磁盘的概率会大大降低,数据库访问的时延会大大降低,吞吐量会大大增加。

 

五、总结

1水平拆分垂直拆分都是降低数据量大小,提升数据库性能的常见手段

2)流量大,数据量大时,数据访问要有service,并且service不要通过join来获取主表和扩展表的属性

3垂直拆分的依据,尽量把长度较短,访问频率较高的属性放在主表

希望没有浪费你这一分钟,帮转哈。

==【完】==

相关阅读:

啥,又要为表增加一列属性?

这才是真正的表扩展方案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一分钟掌握数据库垂直拆分 的相关文章

  • css web页面实现一个弹窗

    div 基本层级 div class pc invest join container div class bg wrap div class place hold div div class top container div class
  • go 类型断言

    1 什么是类型断言 由于 interface 是 一般类型 不是具体类型 如果要转成具体类型 就需要使用类型断言 直接将 x 的值 赋给 a 是不可以的 编译前检查都过不去 断言后可成功赋值 输出结果为 5 2 带检查的类型断言 类型断言有

随机推荐

  • 继承和方法重写

    目录 继承的基本概念 super关键字 1 使用super关键字调用父类成员 子类对象 实例化子类对象 方法重写 方法重写特点 继承的基本概念 1 继承是面向对象的三大特征之一 继承可以解决编程中代码冗余的问题 是实现代码重用的 重要手段之
  • 第五章、ROS常用组件

    第五章 ROS常用组件 TF坐标变换 实现不同类型的坐标系之间的转换 rosbag 用于录制ROS节点的执行过程并可以重放该过程 rqt 工具箱 集成了多款图形化的调试工具 可实现的案例 roslaunch turtle tf2 turtl
  • 熄灯问题

    公众号 CppCoding 题目描述 include
  • VMD-LSTM的数据回归预测(主要应用于风速,负荷,功率)

    VMD LSTM预测 clc clear all close all warning off restoredefaultpath tic 导入数据 ff xlsread windspeed xls B2 B1001 ff ff data
  • 利用lambda表达式为槽函数传递参数20221021

    利用lambda表达式为槽函数传递参数 lambda是匿名函数 lambda 参数 函数体 fun lambda print 我是没有参数的lambda函数 fun 我是没有参数的lambda函数 fun xy lambda x y pri
  • @那些想要转行AI的人:送你一份人工智能入门指南

    人工智能是什么 人工智能为何重要 我们应该畏惧人工智能吗 为什么突然之间所有人都在谈论人工智能 你可能会从网上知道人工智能如何为亚马逊和Google的虚拟助理提供支持 或者人工智能如何一步步地取代所有的工作 有争议的 但是这些文章极少很好的
  • Qt(2):MOC文件解析

    在Qt下 从QObject派生的类都会生成moc 文件 1 比如现在有2个文件 qmyobject h和qmyobject cpp 它里面有一个类QMyObject 记为版本A cpp view plain copy print class
  • hadoop中的ssh无密码登录配置

    目标 在配置hadoop分布式安装过程中 需要配置ssh的无密码登录 在组建hadoop集群的时候 需要多台实体机进行通信 发送或者读取数据 namenode和datanode之间 就是借助ssh 在通信过程中如果需要操作人员频繁输入密码是
  • 域名服务器从k8s访问不稳定,使用云厂商托管K8S时容器域名解析注意事项

    云厂商托管 Kubernetes 服务的 Pod 域名解析注意事项 使用云厂家提供托管式Kubernetes Pod的域名解析参数 通过界面创建Pod的话 可能厂商界面没有开放dnsConfig配置 采用了一些默认值 在使用时候 需要了解清
  • 人工智能与伦理问题浅谈

    第一章 绪论 一 提出问题 人工智能 Artificial Intelligence 缩写为AI 一词 是在1956年的达特茅斯会议上被首次提出来的 作为一门新兴的交叉学科 人工智能在当今脑科学 认知科学飞速发展的基础下 被称为本世纪三大科
  • element中table组件使用多级表头后在点击事件中为变量赋值会出现抖动

    出现情况 一般出现在表头中设置了v if v if的表头在更新数据时自动重新计算一次宽高 解决方法 为表格设置doLayout方法 更新数据前重写表格样式 不在重新计算宽高 beforeUpdate this nextTick gt 在数据
  • springboot国际化配置中英文切换

    1 新建项目 第一步新建springboot项目 勾选web依赖 或者后面进入在pom xml中加入也可以 2 项目结构 项目pom xml
  • 今日笔记:关于Symbol(Symbol.iterator)的使用笔记

  • 【问题及解决】win11 vmware创建虚拟机之后电脑和虚拟机都变得特别卡

    由于之前用的是wsl ubuntu发现编译SDK一直失败 别人提示改用VMware创建虚拟机 所以在win上的这里 控制面板 程序 启用或关闭windows功能 关闭了原来勾选的 适用于Linux的Windows子系统 和 虚拟机平台 并且
  • python的一些技巧和知识点(二)

    书接上文 这篇再记录10条我觉得有用的 虽然没多少人看 但我相信还是会帮助到一部分人的 哪怕是个位数也好 此外 就当作自己的记录吧 没有看过第一篇的朋友点击这里 1 正确复制一个列表 假设有一个列表a 之后需要复制一份儿这个列表 新列表记作
  • 算法之路-------差分数组

    这里写目录标题 差分数组的由来 差分数组的具体使用 具体题目 差分数组的由来 针对数组中连续的大量数据进行修改的问题 如果我们对每个数据都进行依次修改 对于一些少量的数据的修改 例如 1 100这些的 修改的时候我们发现速度貌似还是很快的
  • ABB技术参考手册、RAPID指令、函数和数据类型

    地址 https download csdn net download weixin 47816096 87575468
  • 搭建DVWA漏洞环境靶场

    一 DVWA简介 DVWA是一款开源的渗透测试平台 包含Brute force 暴力破解 XSS CSRF SQL注入 文件上传与下载等漏洞 并分各个等级难度的测试环境 DVWA链接 网盘自取 链接 https pan baidu com
  • 妙借Git自带的OpenSSL生成RSA公私钥的.pem 文件

    大家好 我是神韵 是一个技术 生活博主 出文章目的主要是两个 一是好记忆不如烂笔头 记录总结中提高自己 二是希望我的文章可以帮到大家 欢迎来点赞打卡 你们的行动将是我无限的动力 本篇主题是 妙借Git自带的OpenSSL生成RSA公私钥的
  • 一分钟掌握数据库垂直拆分

    转自 2016 12 20 58沈剑 一 缘起 当数据库的数据量非常大时 水平切分和垂直拆分是两种常见的降低数据库大小 提升性能的方法 假设有用户表 user uid bigint name varchar 16 pass varchar