小研究 - MySQL 分区分表的设计及实(一)

随着信息技术的快速发展,数据量越来越大,海量的表查询操作需要消耗大量的时间,成为影响数据库访问性能提高的主要因素。为了提升数据库操作的查询效率和用户体验,在关系型数据库管理系统(MySQL)中通过 range 分区和 Merge 存储,提出优化的分区分表算法。实验证明,优化后的算法在实现大数据量的表查询操作中,工作效率明显提高。

目录

1 分区分表的目的及 MySQL 的分区方式

1.1 分区分表的目的

1.2 MySQL 的分区方式及优点

2 Merge 存储引擎

2.1 Merge 存储引擎的操作

2.2 Merge 存储引擎的优点

3 使用 range 分区实现 MySQL 分区设计

3.1 员工表的创建及记录添加

3.2 修改分区语句


信息技术快速发展,数据库中的表越来越多,大数据应用正成为软件应用的主流。在未进行分表的
情况下,数据查询等操作的开销越来越大,数据库所能承载的数据量、数据处理能力都将遭遇瓶颈,最终导致系统的响应时间和吞吐量等关键指标不断下降。

MySQL 是应用最为广泛的关系型数据库管理系统之一,具有高性能、易部署、易使用、存储数据方便等特点,可以处理拥有上千万条记录的大型数据库,在应用系统中被大量使用。利用 MySQL 分表技术将大表进行分裂,通过分片和逻辑分割,将优化数据库性能,提高数据库的查询效率。若表查询操作频繁,分表设计将直接影响系统的应用性能和网络的服务质量。本文在 MySQL 表中通过 range 分区和 Merge 存储,提出优化的分区分表算法,提升用户在查询海量数据时的工作效率,使用户获得良好的使用体验。

1 分区分表的目的及 MySQL 的分区方式

1.1 分区分表的目的

当一个数据库表中的数据量过大时,会面临以下问题:数据操作变慢,进行 select,join,update,delete 等操作时,会对全表操作;不便于存储,出现磁盘空间存储不下这张表的情况。通过数据表分区,减小数据文件的大小,提高磁盘读写性能,在一定程度上能解决上述问题。

在系统设计数据库时,如果数据表的数据量超过几百万条,查询一次所花的时间会增加;如果联合查询,则有可能会死机。分表的目的就在于减小数据库的负担,缩短查询时间。

1.2 MySQL 的分区方式及优点

MySQL 提供了多种分区方式,常见的有:

①range 分区,基于一个给定连续区间范围,把数据分配到不同的分区,如按照商品号进行分区,在创建表时,可以使用 partition by range 子句来设置分区方式;

②list 分区,按照某个离散的列表将数据分区,如按照订单状态进行分区,在创建表时,可以使用partition by list 子句来设置分区方式;

③hash 分区,根据数据的哈希值将数据均匀地分散到多个分区中,可以提高查询和负载均衡的效率,在创建表时,可以使用 partition by hash 子句来设置分区方式;

④组合分区,将多个分区方式结合起来,如先按照日期范围进行分区,再按照订单状态进行分区,在创建表时,可 以 使 用 partition by range/list/hash 子 句 和partition by subpartition 子句来设置组合分区方式。

采用 MySQL 分区,主要优点为:和单个磁盘或者文件系统分区相比,可以存储更多数据;在 where子句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率,在涉及 sum()和 count()这类聚合函数的查询时,可以在每个分区上并行处理,最终只需要汇总分区得到的结果;对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据;通过跨多个磁盘分散数据查询,获得更大的查询吞吐量。

2 Merge 存储引擎

研究大量的临时数据时,需要使用内存存储引擎,以存储所有的表格数据。在 MySQL 中,默认配
置了许多不同的存储引擎,以便灵活处理各种数据。Merge 存储引擎是将一定数量的 myisam 表联合成一个整体,在超大规模数据存储时非常有用。

2.1 Merge 存储引擎的操作

Merge 存储引擎中,myisam 表结构完全相同,索引也按照同样的顺序和方式定义。Merge 表本身并没有任何数据,对 Merge 类型的表进行插入、更新、删除、查询等操作,实际是对内部的 myisam 表进行操作。删除 Merge 表只是删除 Merge 表的定义,对内部的 myisam 表没有任何影响。

对 Merge 类 型 表 的 插 入 操 作,通 过 insert _method 子句定义,可以有三个不同的值。first 值使插入作用在第一张表上;last 值使插入作用在最后一张表上;若不定义子句,则表示不能对 Merge 表执行插入操作。

2.2 Merge 存储引擎的优点

Merge 存储引擎的优点主要体现在以下方面:查询速度比一张大表查询效率更高;引用多个数据表无须发出多条查询,查询 Merge 表就可以查到所有数据;适用于存储日志数据,将不同月份的数据存入不同的表,使用 myisampack 工具压缩数据减少空间,Merge 表查询正常工作;方便维护修复单个的小表,比修复大数据表更加容易;多个子表映射到一个总表的速度非常快,Merge 表本身不会存储和维护任何索引,索引都是由各个关联的子表存储和维护,所以创建和重新映射 Merge 表的速度非常迅速。

3 使用 range 分区实现 MySQL 分区设计

在系统设计中,随着数据量的逐渐增加,查询数据效率会降低,通过采用 range 分区算法,加快数据的访问速度,快速查询所需数据。range 分区表根据 values less than 操作符把数据划分为不同的区,在进行数据查询时不需要全表查询,只需要对某个区进行查询,大大缩小了搜索范围,查询效率快速提升,数据处理能力进一步加强,满足了海量数据查询遭遇瓶颈的问题。下面以员工的查询为例说明 range 分区算法的实现。

3.1 员工表的创建及记录添加

首先,创建员工表。
        create table employees_new(id int not null,fname varchar(30),
        lname varchar(30),
        hired date not null default '1973 -01 -01',
        separated date not null default '9999 -12 -31',
        job_code int not null default 0,
        store_id int not null default 0)
        partition by range(store_id)(
        partition p0 values less than (6),
        partition p1 values less than (11),
        partition p2 values less than (16),
        partition p3 values less than (21));

其次,给 employees_new 插入 7 条记录。

        insert into employees _ new ( id,fname,lname,hired,store_id) values(1,'张三丰','张','2020 -06 -04',1);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(2,'李思思','李','2019 -07 -01',5);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(3,'王墨海','王','2018 -12 -14',10);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(4,'赵家琪','赵','2021 -06 -06',15);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(5,'田草草','田','2022 -01 -20',20);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(6,'范小宣','范','2023 -03 -06',9);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(7,'刘振国','刘','2022 -03 -20',20);

添加完成后,查询结果如图 1 所示。

3.2 修改分区语句

根据 range 分区方案,store_id 为1 ~5 的员工相对应的所有行保存在分区 p0 中,store_id 为 6 ~10 的员工保存在 p1 中,依次类推。注意,每个分区都是按照顺序进行定义的,从最低到最高。根据partition by range 语法的要求,增加一条 store_id >21 的行,出现错误,原因是没有规则包含了 store_id≥21 的行,服务器不知道把此记录保存在哪里。

为解决 store_id > 21,在设置分区时使用 valuesless than maxvalue 子句,该子句提供给所有大于明确指定的最高值。maxvalue 表示最大可能的整数值。因此,通过增加 p4 分区,存储所有 store_id≥21的行,再执行插入语句就可以解决上述问题。sql 过程如下。

        alter table employees_new add partition(partitionp4 values less than maxvalue);
        insert into employees _ new ( id,fname,lname,hired,store_id) values(8,' 岳晴',' 岳','2023 - 02 -10',25);

现在可以看到增加了一条记录后的员工查询结果,如图 2 所示。

3.3查询分区 2 记录语句

查询哪些记录在分区 2 中,sql 语句如下。

        select * from employees _ new where store _ idbetween 6 and 10;

查询结果如图 3 所示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sql 关联了2张表的 update 语句(转)

转自:SQL Update:使用一个表的数据更新另一张表 、update 关联两个表 基本上 select 能支持的关联和子查询操作,都能在 update 语句中使用。 在 where 条件中使用子查询 update a set a.age 1 where id in (select device_id from b) 在 wher…

【VUE】前端实现防篡改的水印

效果 水印的作用 图片加水印的操作一般是由后端来完成,有些站点保护的知识产权的类型可能比较多,不仅仅是图片,可能还有视频、文字等等,对于不同类型的对象添加水印后端操作比较复杂,所有有些站点逐步的让前端去进行水…

Java 集合框架

Java 集合框架提供了一组接口和类,以实现各种数据结构和算法。 集合框架满足以下几个要求。 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。 该框架允许不同类型的集合…

心跳跟随的心形灯(STM32(HAL)+WS2812+MAX30102)

文章目录 前言介绍系统框架原项目地址本项目开发开源地址硬件PCB软件功能 详细内容硬件外壳制作WS2812级联及控制MAX30102血氧传感器0.96OLEDFreeRTOS 效果视频总结 前言 在好几年前,我好像就看到了焊武帝 jiripraus在纪念结婚五周年时,制作的一个心跳跟…

【面试题】 本地运行的前端代码,如何让他人访问?

前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 有时候,我前端写好了项目,想要给其他人看一下效果,可以选择将代码部署到test环境,也可以选择让外部通过i…

RabbitMQ的6种工作模式

RabbitMQ的6种工作模式 官方文档: http://www.rabbitmq.com/ https://www.rabbitmq.com/getstarted.html RabbitMQ 常见的 6 种工作模式: 1、simple简单模式 1)、消息产生后将消息放入队列。 2)、消息的消费者监听消息队列,如果队列中…

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的:除非它们运行起来,否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时,它会尝试把…

测试岗?从功能测试进阶自动化测试开发,测试之路不迷茫...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试新人在想什么…

GD32F103VET输出PWM波形

GD32F103VET将TIMER0_CH3映射到PE14引脚,使其输出PWM波形。测试时,使用示波器看PE14引脚输出的波形,效果更直观。 TIMER0之PWM输出引脚映射如下: TIMER0_REMAP[1:0]"00"(没有映射): TIMER0_CH0默认被映射到PA8引脚 TIMER0_CH1默认…

【51单片机】晨启科技,酷黑版,音乐播放器

四、音乐播放器 任务要求: 设计制作一个简易音乐播放器(通过手柄板上的蜂鸣器发声,播放2到4首音乐),同时LED模块闪烁,给人视、听觉美的感受。 评分细则: 按下播放按键A6开始播放音乐&#xff0…

243. 一个简单的整数问题2(树状数组)

输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4输出样例: 4 55 9 15 解析: 一般树状数组都是单点修改、区间查询或者单点查询、区间修改。这道题都是区间操作。 1. 区间修改用数组数组维护差分数组 2. 区间查询&am…

Spring事务(声明式事务)(Spring的事务,Spring隔离级别,事务传播机制)

目录 一、什么是事务,为什么要用事务 二、Spring声明式事务 🍅 1、Transactional的使用 🎈 事务回滚 🎈注意:异常被捕获,不会发生事务回滚 🍅 2、Transactional 作⽤范围 🍅 …

跨隔离网文件交换,IT部门和业务部门难以兼顾怎么办?

网络隔离技术作为有效的网络安全和数据安全的管理手段,现在已经被充分运用在企业网络建设中。但企业进行网络隔离是基于安全考虑,被隔离的网络间的数据交换需求不会因网络隔离而消失,因此,企业就需要进行隔离网间的数据和文件交换…

element表格+表单+表单验证结合运用

目录​​​​​​​ 一、结果展示 二、实现代码 一、结果展示 1、图片 2、描述 table中放form表单,放输入框或下拉框或多选框等; 点击添加按钮,首先验证表单,如果存在没填的就验证提醒,都填了就向下添加一行表单表…

力扣:54. 螺旋矩阵(Python3)

题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 来源:力扣(LeetCode) 链接:力扣 示例: 示例 1: 输入:matrix [[1,…

过滤器和拦截器的六大区别

平时觉得简单的知识点,但通常都不会太关注细节,一旦被别人问起来,反倒说不出个所以然来。真的就是一看就会一说就废。下面带大家一起结合实践来区分过滤器和拦截器吧~ 通俗理解: (1)过滤器(Fil…

vue-cli

vue-cli脚手架 案例一: 案例二: 案例三: ​ 一、脚手架简介 Vue脚手架是Vue官方提供的标准化开发工具(开发平台),它提供命令行和UI界面,方便创建vue工程、配置第三方依赖、编译vue工程 1. …

2023年华数杯数学建模C题思路 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一,她不仅为婴儿提供营养物质和身体保护, 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况,如抑郁、焦虑、 压力等,可能会对婴儿的认知、情…

Centos更换网卡名称为eth0

Centos更换网卡名称为eth0 已安装好系统后需要修改网卡名称为eth0 编辑配置文件将ens33信息替换为eth0,可在vim命令模式输入%s/ens33/eth0/g替换相关内容 修改内核文件,添加内容:net.ifnames=0 biosdevname=0 [root@nova3 ~]# vim /etc/default/grub 使用命令重新生成g…

VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…