小研究 - 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 所示。

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

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

相关文章

c++:day4

1.思维导图 2.shell函数获取uid和gid,并用变量接 #!/bin/bashfunction fun() {read -p "输入用户名" necho uid:id -u $necho gid:id -g $n } afun echo $a3.冒泡、选择和快排代码整理 /**************************************************************…

嵌入式一开始该怎么学?学习单片机

学习单片机: 模电数电肯定必须的,玩单片机大概率这两门课都学过,学过微机原理更好。 直接看野火的文档,芯片手册,外设手册。 学单片机不要纠结于某个型号,我认为stm32就OK,主要是原理和感觉。…

窥探系列之Mybatis-plus XML分页查询

mybatisPlus分页查询原理 searchCount字段控制是否查询总记录数 com.baomidou.mybatisplus.plugins.PaginationInterceptor 该插件拦截sql,如果searchCounttrue,则使用sql解析包jsqlparser根据原sql生成count语句,另外关键

分布式应用:Zookeeper 集群与kafka 集群部署

目录 一、理论 1.Zookeeper 2.部署 Zookeeper 集群 3.消息队列 4.Kafka 5.部署 kafka 集群 6.FilebeatKafkaELK 二、实验 1.Zookeeper 集群部署 2.kafka集群部署 3.FilebeatKafkaELK 三、问题 1.解压文件异常 2.kafka集群建立失败 3.启动 filebeat报错 4.VIM报错…

服务器数据恢复-raid5同步过程中又有一块磁盘报警的数据恢复案例

服务器数据恢复环境: 某研究院一台DELL存储,15块硬盘搭建的一组RAID5磁盘阵列。 该RAID5阵列只有一个卷组,该卷组占用了阵列的全部空间;该卷组只有一个起始位置为0扇区的XFS裸分区。 服务器故障&初检&分析: 该…

Android前沿技术?Jetpack如何?

Jetpack Compose是Android开发领域的一项前沿技术,它提供了一种全新的方式来构建用户界面。近年来,Jetpack Compose在各大招聘等网站上的招聘岗位逐渐增多,薪资待遇也相应提高。本文将从招聘岗位的薪资与技术要求入手,分析Jetpack…

多线程的创建,复习匿名内部类,Thread的一些方法,以及lambda的变量捕捉,join用法

一、💛 Java的Thread类表示线程 1.创建类,继承Thread重写run方法 2.创建类,实现Runnable重写run方法 3.可以继承Thread重写run基于匿名内部类 4.实现Runnable重写run基于匿名内部类 5.lamdba表达式表示run方法的内容(推荐&#x…

16-3_Qt 5.9 C++开发指南_使用QStyle 设置界面外观_实现不同系统下的界面效果的匹配

文章目录 1. QStyle的作用(实现不同系统下的界面效果的匹配)2. Qt内置样式的使用3. 源码3.1 可视化UI设计3.2 mainwindow.cpp 1. QStyle的作用(实现不同系统下的界面效果的匹配) Qt 是一个跨平台的类库,相同的界面组件…

算法与数据结构-跳表

文章目录 什么是跳表跳表的时间复杂度跳表的空间复杂度如何高效的插入和删除跳表索引动态更新代码示例 什么是跳表 对于一个单链表来讲,即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率…

虚继承中对象占用的内存空间

1、虚继承中对象占用的内存空间1 #include <iostream> using namespace std;class AA {void show() {}int max(int a, int b) { return a > b ? a : b; } }; //函数并不占用内存空间class A {}; //占位符class B {int c; }; //含有一个int型数据成员class C :vi…

1. 软件生命周期C/S、B/S 架构

目录 1. 软件生命周期 2. 面向对象 2.1 面向对象分析 2.2 面向对象设计 2.3 面向对象编程 3. C/S、B/S 架构 3.1 CS 架构 3.2 BS 架构 1. 软件生命周期 软件生命周期中划分为可行性研究、需求分析、概要设计、详细设计、实现、组装(集成)测试、 确认测试、使用、维护…

LiveGBS流媒体平台GB/T28181常见问题-无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

LiveGBS无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.…

【C++从0到王者】第十七站:手把手教你写一个stack和queue及deque的底层原理

文章目录 一、stack1.利用适配器2.栈的实现 二、queue三、deque1.deque介绍2.deque的接口3.deque的基本使用4.deque的效率5.deque的原理 一、stack 1.利用适配器 我们不可能写了一份数组栈以后&#xff0c;还要在手写一个链式栈&#xff0c;这样显得太冗余了。于是我们可以利…

Redis未授权访问漏洞

Redis未授权访问漏洞 一、未授权访问漏洞概述、二、Redis未授权访问特征三、Redis常用命令四、Redis历史漏洞4.1、Redis未授权访问4.2、Redis主从复制RCE 五、Reids未授权访问利用5.1、写webshell5.2、写定时任务反弹shell 一、未授权访问漏洞概述、 未授权访问漏洞可以理解为需…

【C++】Lambda表达式的使用

学习目标&#xff1a; 例如&#xff1a; 了解Lambda的优点 掌握Lambda表达式的使用 了解Lambda表达式的底层原理 学习内容&#xff1a; Lambda表达式的语法 文章目录 学习目标&#xff1a;学习内容&#xff1a;Lambda表达式排序案例Lambda表达式语法捕捉列表Lambda表达式模拟…

Javascript 数据结构[入门]

作者&#xff1a;20岁爱吃必胜客&#xff08;坤制作人&#xff09;&#xff0c;近十年开发经验, 跨域学习者&#xff0c;目前于海外某世界知名高校就读计算机相关专业。荣誉&#xff1a;阿里云博客专家认证、腾讯开发者社区优质创作者&#xff0c;在CTF省赛校赛多次取得好成绩。…

3年经验,面试测试岗只会功能测试开口要求18K,令我陷入沉思。

由于朋友临时有事&#xff0c; 所以今天我代替朋友进行一次面试&#xff0c;公司需要招聘一位自动化测试工程师&#xff0c;我以很认真负责的态度完成这个过程&#xff0c; 大概近30分钟。 主要是技术面试&#xff0c; 在近30分钟内&#xff0c; 我与被面试者是以交流学习的方式…

java linq多字段排序时间比较

public static void main(String[] args) {//100万条数据List<CrmInvestSaleUserCount> waitAssignUserList new ArrayList<>();for (int i 0; i < 1000000; i) {waitAssignUserList.add(new CrmInvestSaleUserCount().setSales_username("test" i…

架构训练营学习笔记:6-2 微服务基础选型

基础选型 微服务基础设施架构 优先级 其中&#xff0c;核心 就是服务注册、服务发现、服务路由。 模式1-嵌入SDK 模式2-反向代理式 模式3-网络代理式&#xff08;Service Mesh&#xff09; 模式对比 常见微服务框架选择 嵌入SDK-dubbo Spring Cloud 反向代理式 APISIX …

C++类的定义和对象的创建

一、问题引入 C类和对象到底是什么意思&#xff1f; 1、C 中的类&#xff08;Class&#xff09;可以看做C语言中结构体&#xff08;Struct&#xff09;的升级版。结构体是一种构造类型&#xff0c;可以包含若干成员变量&#xff0c;每个成员变量的类型可以不同&#xff1b; …