数据库表拆分:水平分表、垂直分表

news/2024/10/24 10:53:12/

数据库设计中,如果单张表的数据量过大,会导致查询很慢,这时候就要考虑对表的拆分,常见拆分方式有两种,水平分表和垂直分表。

水平分表:

数据库水平分表指数据库按照某种算法,常见的有范围法,HASH法,将数据存在不同表中。

范围法:根据数据条数进行分表存储,举例:ID为1亿-2亿的数据存一张表,3亿到4亿的数据存一张表。

HASH法:按照ID取模,将数据均匀进行分配。

水平分表的特点是所有数据的表结构都是完全一样的。

解决的是数据量大的存储问题。

垂直分表:

垂直分表是将一张大表按照‘列’才分为2张或多张的小表,通过主外键关联来获取数据。

以商品表为例,商品表的字段可以按照下图的方式,拆分为两张表:商品基本信息表、商品详情信息表。

通过垂直分表的操作,查询SQL也会发生变化,如上图所示,拆表前,只需要查询单张表就可以完成,拆表后要进行表关联,来达到查询的目的。

为何要做垂直分表,则需要明白数据库的存储原理。以mysql的innerDB引擎为例:

一行一行的数据,被成为row。

管理数据的基本单位为page(页),默认大小16KB,作为mysql中保存page的基本单位称作Extent(区),一个区由连续的页组成,默认一个区有1M的存储空间,即一个区可以连续装载64个页。每一页中,根据数据的大小,可以存储多行数据。

在innerDB的1.0以后,引入了新特性,压缩页,也就是对页进行压缩,让实际存储小于逻辑存储。有压缩也就有解压缩。

在设计表时尽量保证,每一页内尽可能多存储一些行数据,这样可以减少跨页检索,尽可能提高页内数据的检索效率。

以上是优化数据库的理论支撑。

再回到示例中的商品表,假如有1亿数据量的商品信息。

不拆表:全部数据都存储在一张表中,如果一行数据有1K,大概需要625万页来进行存储。

拆表:将重要的基础字段放到商品基本信息表中,其他的多个描述信息字段,放到商品详情信息表中。

这样拆分以后,假如商品基本信息表,每一行数据大小为64字节。1亿数据,只需要39万页就可以将数据完整存储。

拆分后,在对商品基本信息表的扫描,只需要对39万页的内容进行扫描,与未拆分表的625万页相比,少了16倍,差距是非常大的。

快速扫描后,会定位到商品ID,再通过商品ID主键索引,去商品详情表中将对应数据进行提取,从而提升查询效率。

总结:通过将总要字段单独剥离出来一张小表,让每一页能容纳更多的行,进而缩小数据扫描的范围,达到提高执行效率的目的。
 

垂直分表原则:

1.单表数据量未来可能为千万级。

2.表字段超过20个,且包含了超长的varchar、CLOB、BLOB等大数据字段类型。

如果满足以上两个条件,可以考虑进行垂直分表。

表字段拆分原则:

1.小表字段(示例中的商品基本信息表):

数据查询、排序时需要的字段,如分类编号、商品ID、商品编号、逻辑删除标志位。

高频访问的小字段,如商品名称、子标题、价格、厂商基本等。

2.大表字段(示例中的商品详情信息表):

低频访问字段:配送信息、售后声明、最后更新时间等。

大数据字段:商品图文详情、图片BLOB、JSON元数据等。

大字段可能拆分为多张表,示例中只是拆分为两张表,根据实际情况,可能拆分为多张表,来达到优化数据存储的目的。


http://www.ppmy.cn/news/1541581.html

相关文章

react1816中的setState同步还是异步的深层分析

setState 是 react 中更新 UI 的唯一方法,其内部实现原理如下: 调用 setState 函数时,React 将传入的参数对象加入到组件的更新队列中。React 会调度一次更新(reconciliation),在调度过程中,Re…

《C Primer Plus》中文版第十三章习题

13.10 复习题 1. 下面的程序有什么问题? 答案: 1. 应该把fp声明为文件指针:FILE *fp; 2. 要给fopen函数提供一种模式:fopen_s(&fp, "gelation", "w"); 3. fputs()函数的参数顺序应该反过来。输出字符串应该有一个换行符,提高可读性。…

AListFlutter(手机alist)——一键安装,可在手机/电视上运行并挂载各个网盘

前面提到软路由系统OpenWRT的时候,当时说过可以在OpenWRT里安装alist,然后挂载网盘,这样就可以通过webdav的方式在家庭局域网下的任何设备都可以访问操作这些网盘,摆脱硬盘空间不够的问题。 但alist的官方版本是没有手机版本的&a…

ubuntu 20.4 安装 openssl 3.x

ubuntu 20.4 安装 openssl 3.x ubuntu 20.4 自带了openssl 1.0.2,升级为 openssl 3.x: # 下载 openssl 源代码压缩包 wget https://www.openssl.org/source/openssl-3.0.10.tar.gz# 安装编译包 sudo apt-get install -y g sudo apt-get install -y mak…

将jinjia2后端传到前端的字典数据转化为json

后端代码 from flask import Flask, render_template, jsonifyapp Flask(__name__)app.route(/) def index():data {key: value, number: 123}return render_template(index.html, datadata)if __name__ __main__:app.run(debugTrue) 前端代码 使用tojson过滤器即可 <!…

Lua数字

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua作为一种动态类型的脚本语言&#xff0c;对数字的处理既简单又高效。在Lua中&#xff0c;数字主要分为整数和浮点数&#xff0c;且都遵循IEEE 754双精度浮…

C++ 图像处理框架

在 C 中&#xff0c;有许多优秀的图像处理框架可以用来进行图像操作、计算机视觉、图像滤波等任务。以下是一些常用的 C 图像处理框架&#xff0c;每个框架都有其独特的特性和适用场景&#xff1a; 1. OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xf…

SQLI LABS | Less-3 GET-Error based-Single quotes with twist-String

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-3/ 靶场提示 …