【SQL应知应会】表分区(一)• MySQL版

news2024/11/16 17:48:54

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

分区表 • MySQL版

  • 一、分区表
  • 1.非分区表
  • 2.分区表
    • 2.1 概念
    • 2.2 MySQL数据库表分区
      • 2.2.1 InnoDB 逻辑存储结构
      • 2.2.2 段(segment)
      • 2.2.3 区(extent)
      • 2.2.4 页(page)
    • 2.3 MySQL数据库分区的由来
    • 2.4 为什么对表进行分区?
      • 2.4.1 表分区要解决的问题
      • 2.4.2 表分区有如下优点:
    • 2.5 MySQL的分区形式
      • 2.5.1 水平分区(HorizontalPartitioning)
      • 2.5.2 垂直分区(VerticalPartitioning)
    • 2.6 MySQL分区的类型
      • 2.6.1 range分区:范围表分区,按照一定的范围值来确定每个分区包含的数据

一、分区表

1.非分区表

  CREATE TABLE IF NOT EXISTS student
        (id INT, name VARCHAR(50), age INT, address VARCHAR(100));CREATE TABLE IF NOT EXISTS `student`
        ( `id` INT, `name` VARCHAR(50), `age` INT, `address` VARCHAR(100) ) ;
  • 注意: 数据库名、表名、字段名反勾号` 是系统导出DDL语句自带格式,也可以不写。

2.分区表

2.1 概念

分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。
但是对于应用程序来讲,分区的表和没有分区的表是一样的。
换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。

MySQL在创建表的时候可以通过使用PARTITION BY子句定义每个分区存放的数据。在执行查询的时候,优化器根据分区定义过滤那些没有我们需要的数据的分区,这样查询就可以无需扫描所有分区,只需要查找包含需要数据的分区即可。

分区的另一个目的是将数据按照一个较粗的粒度分别存放在不同的表中。这样做可以将相关的数据存放在一起,另外,当我们想要一次批量删除整个分区的数据也会变得很方便(可以单独truncate分区)

delete 要记录日志,如果开启事务的话,可以进行回滚,一行一行的删除,效率慢
truncate 直接删除底层的数据页,MySQL的物理结构底层是数据页

2.2 MySQL数据库表分区

2.2.1 InnoDB 逻辑存储结构

  • InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace。表空间又由段(segment)区(extent)页(page) 组成。
  • 页在一些文档中有时也称为块(block),1 extent = 64 pages
    请添加图片描述

2.2.2 段(segment)

表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。

  • 对于回滚段,进行delete后可以回滚数据,所以delete既占空间也耗时间,truncate相当于直接将页格式化了(不要再讲truncate是讲表删除后又重建了一个,不太恰当)
  • InnoDB存储引擎表是索引组织的(index
    organized),因此数据即索引,索引即数据。那么数据段即为B+树的页节点(上图的leaf node
    segment),索引段即为B+树的非索引节点(上图的non-leaf node segment)。

  • 与Oracle不同的是,InnoDB存储引擎对于段的管理是由引擎本身完成,这和Oracle的自动段空间管理(ASSM)类似,没有手动段空间管理(MSSM)的方式,这从一定程度上简化了DBA的管理。

  • 需要注意的是,并不是每个对象都有段。因此更准确地说,表空间是由分散的页和段组成。

2.2.3 区(extent)

区是由64个连续的页组成的,每个页大小为16KB,即每个区的大小为1MB。对于大的数据段,InnoDB存储引擎最多每次可以申请4个区,以此来保证数据的顺序性能。

在我们启用了参数innodb_file_per_talbe后,创建的表默认大小是96KB。

区是64个连续的页,那创建的表的大小至少是1MB才对啊?其实这是因为在每个段开始时,先有32个页大小的碎片页(fragment page)来存放数据,当这些页使用完之后才是64个连续页的申请。这样做得目的是,对于一些小表或者undo类的段,可以开始申请较小的空间,节约磁盘开销

2.2.4 页(page)

页就是上图的page区域,也可以叫块。

页是InnoDB磁盘管理的最小单位。默认大小为16KB,可以通过参数innodb_page_size来设置

常见的页类型有:数据页,undo页,系统页,事务数据页,插入缓冲位图页,插入暖冲空闲列表页,未压缩的二进制大对象页,压缩的二进制大对象页等。

2.3 MySQL数据库分区的由来

  • 传统不分区数据库痛点
    mysql数据库中的数据是以文件的形式存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的。(这是myisam引攀,如果是innodb,则是frm和ibd文件,索引和数据在一起

2.4 为什么对表进行分区?

为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。

2.4.1 表分区要解决的问题

当表非常大,或者表中有大量的历史记录,而“热数据“却位于表的末尾。如日志系统、新闻…此时就可以考虑分区表。(热数据就是经常使用的数据)
【注:此处也可以使用分表,但是会增加业务的复杂性】

2.4.2 表分区有如下优点:

  • 与单个磁盘或文件系统分区相比,可以存储更多的数据
  • 对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。
    • 相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
    • 同样的,你可以很快的通过删除分区来移除旧数据,还可以优化、检查、修复个别分区
  • 一些查询可以得到极大的优化。可以把一些归类的数据放在一个分区中,可以减少服务器检查数据的数量加快查询。
    • 这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。

PS:因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。

  • 涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。
    • 通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。

这种查询的一个简单例子如

SELECT salesperson_id,COUNT (orders) as order_total 
FROM sales 
GROUP BY salesperson_id
  • 通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

2.5 MySQL的分区形式

2.5.1 水平分区(HorizontalPartitioning)

  • 这种形式的分区是对根据表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分别(单分区)或集体分别(1个或多个分区)
  • 所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持
  • 水平分区一定要通过某个属性列来分别,常见的有年份、日期

2.5.2 垂直分区(VerticalPartitioning)

  • 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,是某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的所有行

2.6 MySQL分区的类型

  • 根据所使用的不同分区规则可以分成几大分区类型
    请添加图片描述

  • MySql默认是支持表分区的,可以通过语句查询是否开启表分区功能:show plugins

2.6.1 range分区:范围表分区,按照一定的范围值来确定每个分区包含的数据

  • 语法如下:
    partition by range(id) partition p0 values less than()
  • 示例:
create table user(id int(11) not null,name varchar(32) not null)  -- 正常的创建语句
partition by range(id)   -- 根据表字段id来创建分区  <--分区的定义
( -- 分区实例 -->
  partition p0 values less than(10),       -- 第一个分区p0,范围~-9
  partition p1 values less than(20),       -- 第二个分区p1,范围10-19
  partition p2 values less than(30),       -- 第三个分区p2,范围20-29
  partition p3 values less than maxvalue   -- 第四个分区p3,范围30-~
)   -- 需要注意的是分区字段“id”的取值范围等于分区取值范围
  • maxvalue只是可以这么做,但是实际情况不可能把后面的所有数据都放在同一个分区,如果进行删除的话,那就是直接将后面的所有数据都删除了,不符合业务逻辑
  • range分区,一般用于生产运维、比较固化的调度场景,很少进行补数据的操作,如果涉及到补数据
    • 根据上面的分区,假设要把范围15-19的放在一个新的分区,这就需要用到其他的手段,如重组分区recognation,如果是Oracle的话,还需要进行split,对分区进行一个分割
    • 以后想补旧的数据的时候,假设对第一个分区进行再分割,很不方便,之后会用存储过程进行存取数据的操作,存储过程的变量定义都是写死的,很难去增加一个范围分区(往后增加可以,比如上面的maxvalue,但是不能往前增加,比如上面的第一个分区的前面)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

整齐有序!统一命名文件,高效管理数据轻松实现!

在数字化时代&#xff0c;我们每天都与大量文件打交道&#xff0c;文件名杂乱无章、难以辨识的情况是司空见惯的。这不仅浪费我们宝贵的时间&#xff0c;还可能导致信息混乱和数据丢失。但是&#xff0c;抛开这一切困扰吧&#xff01;现在&#xff0c;我们向您介绍一个简单却强…

C++—string类

本期我们来学习C的string&#xff0c;本期内容相当的多&#xff0c;且有一定难度&#xff0c;需要大家静下心来看 目录 1.标准库中的string 1.1string类的介绍 1.2 string类的常用接口 构造函数、析构函数、赋值、拷贝构造 npos push_back append operator[ ] size …

什么是ASPICE认证

ASPICE&#xff1a; “AutomotiveSoftware ProcessImprovement and CapacityDetermination”&#xff0c;即汽车软件过程改进及能力评定。它是一个过程模型&#xff0c;由过程和能力度两个维度构成&#xff0c;用于评价汽车行业软件设计开发的能力水平。 ASPICE的6个级别&…

基于simulink进行场景变化检测(附源码)

一、前言 此示例演示如何及时分割视频。此示例中的算法可用于检测视频流中的重大变化&#xff0c;例如广告开始和结束的时间。场景变换在广告和营销中被广泛应用。通过改变场景&#xff0c;可以吸引消费者的注意力&#xff0c;传达产品或服务的特点和优势。例如&#xff0c;将…

包揽七项葵花奖 参编多项标准 萤石领跑智能家居+物联网云平台行业

7月9日&#xff0c;2023第七届“葵花奖”智能家居评选颁奖盛典在广交会展馆举行&#xff0c;萤石网络一举斩获7项重磅奖项。同时&#xff0c;萤石作为参编单位&#xff0c;受邀参与了《智能门锁测评标准》发布仪式及《智能开关测评标准》启动会&#xff0c;再次彰显了其在智能家…

【一些随笔】浅析 Linux和Windows:系统介绍、操作差异与使用技巧解析

一些随笔 文章内容1️⃣ 那些在Linux上顺理成章&#xff0c;换到Windows上就可能令人费解的事2️⃣ Linux系统介绍及使用技巧3️⃣ Windows系统介绍及使用技巧 文章内容 Linux和Windows系统的操作差异&#xff1b;Linux系统介绍、系统监控和优化技巧、Shell脚本编程技巧、一些…

掌握Python文件操作的绝招:打造数据之径,揭开文件操作的神秘面纱

文章目录 前言文件的基本操作打开文件操作关闭文件操作对文件进行操作1&#xff09;只读文件操作read()readlines()readline()seek() 2&#xff09;只写文件操作3&#xff09;文件追加操作读写、追加读写操作1. r 模式打开文件2. w 模式打开文件3. a 模式打开文件 以二进制的形…

走向 Native 化:SpringDubbo AOT 技术示例与原理讲解

作者&#xff1a;刘军 Java 应用在云计算时代面临“冷启动”慢、内存占用高、预热时间长等问题&#xff0c;无法很好的适应 Serverless 等云上部署模式&#xff0c;GraalVM 通过静态编译、打包等技术在很大程度上解决了这些问题&#xff0c;同时针对 GraalVM 的一些使用限制&a…

用了国产接口管理神器 Apifox 之后,我果断从 Postman “脱坑”了

在当前行业发展背景下&#xff0c;绝大部分项目都是基于前后端分离的架构进行的&#xff0c;由前后端、测试、运维等不同的团队共同开发&#xff0c;那么团队之间能否很好的 协同合作 无疑直接决定着项目的最终效果。 但是在实际开发流程中&#xff0c;团队之间的协同是很低效…

网络编程5——TCP协议的五大效率机制:滑动窗口+流量控制+拥塞控制+延时应答+捎带应答

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 滑动窗口机制 三、TCP协议的 流量控制机制 四、TCP协议的 拥塞控制机制 五、TCP协议的 延时应答机制 六、TCP协议的 捎带应答机制 总结 前言 本人是一个普通程序猿!分享一点自己的…

c语言进阶-printf的用法拓展

Printf函数打印方法拓展&#xff1a; 字符串赋值给指针&#xff0c;相当于把h的地址赋值给p了。 printf函数直接放字符串也是把首地址给printf&#xff0c;然后printf从首地址打印到\0。 打印时可以直接传p地址

IDEA使用教程

1. 查看代码历史版本 若要查看特定 Java 类的代码历史版本&#xff0c;请执行以下操作&#xff1a; 鼠标右键点击所需查看的 Java 类。 在弹出菜单中选择 "Local History"&#xff08;本地历史&#xff09; >> "Show History"&#xff08;显示历史…

云尚办公项目-搭建环境

硅谷项目&#xff0c;由尚硅谷分享&#xff0c;具体项目视频可以根据B站尚硅谷进行学习。搭建项目可以直接根据Spring Boot进行获取&#xff0c;本次主要是个人的的一些分析操作 后面代码主要以分析为主&#xff0c;相关内容不会的&#xff0c;可以观看尚硅谷视频 一、下载配套…

MySQL数据库——多表查询练习

一、练习素材 创建表 -- 创建部门表 create table if not exists dept3( deptno varchar(20) primary key , -- 部门号 name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp3( eid varchar(20) primary key , -- 员工编号 ename varchar(20), -- 员…

【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

详解c++---布隆过滤器

目录标题 位图的优缺点为什么会有布隆过滤器&#xff1a;布隆过滤器的应用场景&#xff1a;布隆过滤器的实现布隆过滤器的测试 位图的优缺点 位图的优点&#xff1a; 1.位图可以节省空间&#xff0c;位图判断存储的数据是在还是不在只用一个比特位就可以记录数据出现的情况&a…

【毕业季·进击的技术er】大学生计算机毕业设计应该这样写

活动地址&#xff1a;毕业季进击的技术erhttps://marketing.csdn.net/p/f4a818f6455f3a9a7a20c89f60ad35f7 目录 扉页 摘要 目录 一 绪论 二、相关技术环境介绍 三、系统需求分析 四、系统架构设计 五、系统实现 六、系统测试 致谢 参考文献 以一个过来学长的角度来看…

SQl排序与分页

1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序 ORDER BY 子句在SELECT语句的结尾。 1.2 单列排序 SELECT last_name, job_id, department_id, hire_date FROM employees ORDER…

元素配对----贪心1 (爱思创)

源代码 #include <bits/stdc.h> using namespace std; int main() {int n,data,sum0;cin>>n;vector<int> vec1,vec2;for(int i0; i<n; i){cin>>data;vec1.push_back(data);}for(int i0; i<n; i){cin>>data;vec2.push_back(data);}sort(ve…

linux下查看cpu使用率和内存占用

top top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器&#xff0c;下面详细介绍它的使用方法&#xff1b; top是一个动态显示过程&#xff0c;即可通过用户按键来不断刷新当前状态。如果在前台…