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

news2024/11/29 0:35:40

随着信息技术的快速发展,数据量越来越大,海量的表查询操作需要消耗大量的时间,成为影响数据库访问性能提高的主要因素。为了提升数据库操作的查询效率和用户体验,在关系型数据库管理系统(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.coloradmin.cn/o/843556.html

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

相关文章

因果推断(三)双重差分法(DID)

因果推断(三)双重差分法(DID) 双重差分法是很简单的群体效应估计方法,只需要将样本数据随机分成两组,对其中一组进行干预。在一定程度上减轻了选择偏差带来的影响。 因果效应计算:对照组y在干预…

【kafka消息查询】kafka消费不到数据,写入端伙伴说他写入了,而且没有报错,如何来切割是写入的问题还是消费的问题

文章目录 前言情景再现如何确定是否写入了为什么出现不能写入总结 前言 kafka消费不到消息,如何查询界定是生产端的问题还是消费端的问题,特别是场景上下文已经丢失了的时候。 情景再现 使用命令: bin/kafka-console-consumer.sh --bootstr…

前端js用正则写一个车牌号验证

var car_number2 (rule, value, callback) > {var plateNumber /^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏…

simpleNet

文章目录 simpleNet0. 背景1. 主要贡献2. 网络3. 方法细节3.1 Feature Extractor 特征提取器3.2 Features Adaptor特征适配器3.3 Anomalous Feature Generator 异常特征生成器3.4 Discriminator 鉴别器3.5 Loss function and Training 损失方程和训练3.6 Inference and Scoring…

网信办制定个人信息保护新规,企业应采取哪些举措实现身份审计合规

近日,国家互联网信息办公室就《个人信息保护合规审计管理办法(征求意见稿)》面向社会公开征求意见。征求意见稿指出,办法根据《中华人民共和国个人信息保护法》等法律法规制定,旨在指导、规范个人信息保护合规审计活动…

K8s的高可用搭建

高可用技术搭建 在master节点上需要部署:keepalived、haproxy

记一款开源免费的终端工具Tabby

经常需要在Windows电脑上远程操作Linux,常用的终端工具有Xshell、SecureCRT、Putty。其中Xshell和SecureCRT功能强大,但是要收费,Putty虽然免费,但是功能上略显单薄。今天给大家介绍的这款终端工具非常强大,他不仅界面…

怎么样通过Bootstrap已经编译好(压缩好)的源码去查看符合阅读习惯的源码【通过Source Map(源映射)文件实现】

阅读本篇博文前,建议大家先看看下面这篇博文: https://blog.csdn.net/wenhao_ir/article/details/132089650 Bootstrap经编译(压缩)后的源码百度网盘下载地址: https://pan.baidu.com/s/14BM9gpC3K-LKxhyLGh4J9Q?pwdm02m Bootstrap未经编译…

【Spring专题】Spring底层核心原理解析

前言 Spring啊,可以说是我们大部分Java玩家【最熟悉的陌生人】了吧。八个字形容:似懂非懂,会也不会 你说简单应用,我们大家都会,那真要展开说两句的话,那只能来这么两句:这是第一句&#xff0…

C高级 作业 day4 8/7

1.整理思维导图 2.写一个函数&#xff0c;获取用户的uid和gid并使用变量接收 3.整理冒泡排序、选择排序和快速排序的代码 冒泡排序 //冒泡排序 void bubble_sort(int a[],int len) {int count0;for(int i1;i<len;i) //控制轮数{for(int j0;j<len-i;j) //控制每一轮交换…

opencv基础-29 Otsu 处理(图像分割)

Otsu 处理 Otsu 处理是一种用于图像分割的方法&#xff0c;旨在自动找到一个阈值&#xff0c;将图像分成两个类别&#xff1a;前景和背景。这种方法最初由日本学者大津展之&#xff08;Nobuyuki Otsu&#xff09;在 1979 年提出 在 Otsu 处理中&#xff0c;我们通过最小化类别内…

代码随想录—力扣算法题:977有序数组的平方.Java版(示例代码与导图详解)

版本说明 当前版本号[20230807]。 版本修改说明20230807初版 文章目录 版本说明977.有序数组的平方思路暴力排序双指针法 两种方法的区别 总结 977.有序数组的平方 力扣题目链接 更多内容可点击此处跳转到代码随想录&#xff0c;看原版文件 给你一个按 非递减顺序 排序的整…

NodeJs执行Linux脚本

&#xff08;我们活着不能与草木同腐&#xff0c;不能醉生梦死&#xff0c;枉度人生&#xff0c;要有所作为。——方志敏&#xff09; 为什么需要使用NodeJs执行Linux脚本 linux的sh脚本命令编写复杂&#xff0c;在不熟悉linux交互式命令的情况下&#xff0c;使用高级编程语言…

Source Insight和Keil中文乱码

1、问题原因 由于Source Insight和Keil中的中文编码方式的不同&#xff0c;导致Keil中添加的中文注释在Source Insight中乱码&#xff1b;在Source Insight中添加的中文注释在Keil中乱码。所以需要统一两者的编码方式。 Source Insight默认编码方式为UTF-8&#xff0c;Keil中一…

SolidWorks二次开发系列入门100篇之98、99-分割、保存零件中的实体

从这四张图&#xff0c;看了来这个保存实体和分割图标是一样的&#xff0c;可能只是选项不一样&#xff0c;所以这里一起写了&#xff0c;不浪费时间。 经过了几个小时的研究&#xff0c;没搞定。大哭 CreateSaveBodyFeature这个没有api例子&#xff0c;2021上有例子&#xff…

从小白到大神之路之学习运维第75天-------Harbor企业镜像仓库部署

第四阶段 时 间&#xff1a;2023年8月7日 参加人&#xff1a;全班人员 内 容&#xff1a; Harbor企业镜像仓库部署 目录 一、案例概述 二、什么是 Harbor &#xff08;一&#xff09;Harbor 的优势 &#xff08;二&#xff09;Harbor 架构构成 &#xff08;三&…

C++动态规划经典试题解析之打家劫舍系列

1.前言 力扣上有几道与打家劫舍相关的题目,算是学习动态规划时常被提及的经典试题,很有代表性,常在因内大大小小的社区内看到众人对此类问题的讨论。 学习最好的方式便是归纳总结、借鉴消化,基于这个目的,本文对此类问题也做了讲解,在一些优秀思想的基础上添加了个人观…

自然语言处理[信息抽取]:MDERank关键词提取方法及其预训练模型----基于嵌入的无监督 KPE 方法 MDERank

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

一百四十八、Kettle——Linux上安装的kettle8.2连接Hive3.1.2

一、目标 kettle8.2在Linux安装好后&#xff0c;需要与Hive3.1.2数据库建立连接 二、前提 &#xff08;一&#xff09;在Linux已经安装好kettle并可以启动kettle &#xff08;二&#xff09;版本&#xff1a;kettle8.2.0 Hive3.1.2 Hadoop3.1.3 &#xff08;三&#…

虹科分享 | 如何通过ntopng流量规则来监控网络流量

让我们假设您有一个网络&#xff0c;其中本地主机生成恒定数量的流量。你如何发现他们是否行为错误&#xff1f;碰巧&#xff0c;一些本地主机行为开始异常&#xff0c;与它们之前相比&#xff0c;有一个异常的流量(发送或接收)&#xff1a;您如何发现这些情况并通过警报报告它…