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

news2024/11/27 12:41:38

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

目录

4 使用 Merge 存储引擎实现 MySQL 分表设计

4.1 创建测试表

4.2 插入记录

4.3 拆分子表实现分表

5 结论


4 使用 Merge 存储引擎实现 MySQL 分表设计

对于数据表中有自增字段,为避免数据重复,在系统设计表时利用触发器完成。Merge 查询经过分表设计后,查询速度比一张大表查询要快很多,大大提高了数据查询效率。

4.1 创建测试表

首先创建三个测试表 payment_2021、payment_2022 和 payment_all,其中 payment_all 是前两个表的merge 表(主表) :

        create table payment_2021
                (id smallint auto_increment primary key,payment_date datetime,amount                 decimal(13,2))engine = myisam character set gbk;
        create table payment_all
                (id smallint AUTO_INCREMENT PRIMARYKEY primary key,payment_date                 datetime,amount decimal(13,2)) engine = merge union = (payment_2021,
                payment_2022) insert_method = last;

4.2 插入记录

分别向 payment_2021 和 payment_2022 表中添加测试数据:

        insert into payment_2021(payment_date,amount)values('2021 -01 - 30',200 000),(2,'2021 - 06 -30',230 000),(3,'2021 -11 -20',260 000);
        insert into payment_2022(payment_date,amount)values('2022 -02 -15',160 000),('2022 -06 -28',210 000),('2022 -12 -20',220 000. 5);

查看 payment_all 表记录,如图 4 所示。

在插入记录过程中出现了 id 重复,造成删除和修改异常,解决办法是给 payment_all 的 id 赋唯一
值,插入一条初始数据,删除 payment _2021 和payment_2022 中的数据。

sql 过程如下:
        create table payment_id(id smallint);
        insert into payment_id values(1);
        delete from payment_2021;
        delete from payment_2022;

在 payment_2021 和 payment_2022 表中建立一个触发器,触发器的功能是当在 payment_2021 或者 payment _ 2022 表 中 增 加 一 条 记 录 时,取 出payment _ id 中 的 id 值,赋 给 payment _ 2021 和payment_2022,然后将 tb_ids 的 id 值加 1。

创建触发器语句如下:

        create trigger tr_seq1
        before insert on payment_2021 for each row begin
        select id into @ tb_ids from payment_id limit 1;
        update payment_id set id = @ tb_ids +1;
        set new. id = @ tb_ids;
        end
        create trigger tr_seq2
        before insert on payment_2022 for each row begin
        select id into @ tb_ids from payment_id limit 1;
        update payment_id set id = @ tb_ids +1;
        set new. id = @ tb_ids;
        end

在 payment_2021 和 payment_2022 表中分别增加一条记录:

        insert into payment_2021(payment_date,amount)values('2021 -02 -10',280 000);
        insert into payment_2022(payment_date,amount)values('2022 -06 -15',230 000);

图 5 所示为添加触发器后 payment_all 表记录。

再次分别在 payment_2021 和 payment_2022 表中各增加三条记录:

        insert into payment_2021(payment_date,amount)values('2021 - 01 - 01',160 000),('2021 - 05-30',190 000),('2021 -12 -20',260 000);
        insert into payment_2022(payment_date,amount)values('2022 - 02 - 01',150 000),('2022 - 06-01',290 000),('2022 -12 -25',220 000);

经验证查询,id 没有重复,触发器创建成功。

4.3 拆分子表实现分表

在系统设计过程中,随着业务量的增加,数据表中数据量急剧增加。为快速查询到所需数据,通过
拆分子表来减少数据的装载量,获得较高的查询效率。

sql 过程如下:

1) 创建员工表

        create table member(member_id bigint auto_increment primary key,member_name varchar(20),member_sex tinyint not null default 0) engine = myisam default charset = utf8 auto _increment =1;

2)创建存储过程添加 500 万条记录

        create definer = `root `@ `localhost ` procedure `member_insert`()
        begin declare i int default 0;
        while i <5 000 000 do
        insert into member(member_name,member_sex)values
        (concat('工号',i),0);
        set i = i +1;
        end while ;
        set autocommit =1;
        end;

3)查询员工表记录

        select count(* ) from member;

4)创建员工 1 表

        create table member1(member_id bigint auto_increment primary key,member_name varchar(20),member_sex tinyint not null default 0) engine = myisam default charset = utf8 auto _increment =1;

同理,创建员工 2 表。

5)把员工表拆分两张表

通过 id 的奇偶号把员工表拆分成员工 1 表和员工 2 表。
        insert into member1(member_id,member_name,member_ sex) select member _ id,member _ name,member_sex from member where member_id%2 =0;
        insert into member2(member_id ,member_name,member_ sex) select member _ id,member _ name,member_sex from member where member_id%2 =1;

6)查询员工 1 表的前 10 万条记录

        select * from member1 limit 100 000;

通过执行上述查询语句,结果证实分表成功。

5 结论

为了提高数据库中大数据查询效率,实现MySQL 查询的可靠性和稳定性,通过分析海量数据查询过程中的分区特点,找出传统表设计方法的不足,并在此基础上提出两种分区分表算法。通过range 分区和 Merge 存储设计进行快速分区分表,有效避免了查询速度缓慢的操作,提高了查询效率。

实验结果表明,提出优化的分区分表设计算法行之有效,优化了分布式部署,数据量控制更精细,数据维护更容易。随着业务量的增加,分表设计还需要进行复杂的设计和集群管理,分区分表设计算法还需要进一步细化。

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

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

相关文章

重生学c++系列第三课类和对象(上)

好的我们重生c系列的前两期已经介绍完了c祖师爷针对C语言补充的几个新功能,现在我们进入c的真正课题学习——类与对象: C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 比如说我们洗菜做饭&am…

QT生成Debug和Release发布版后,运行exe缺少dll问题

在QT Creator生成debug和release的exe执行文件后,运行时,报错缺少*.dll.解决办法1: 在系统环境变量中添加D:\Qt\Qt5.13.2\Tools\mingw730_64\bin后,即可运行。 当使用此方法时,将exe拷贝到其他电脑中运行时&#xff0c…

DAY4,C高级(shell中的函数,循环,排序思想)

1.整理思维导图; 2.写一个函数,获取用户的uid和gid并使用变量接收; 1 #!/bin/bash 2 function get_id()3 {4 read -p "输入用户:…

海外社媒营销:如何树立品牌个性与目标受众共鸣?

随着全球化的不断深入,海外市场对于企业的重要性越来越凸显。在这个数字化时代,社交媒体已经成为品牌塑造和推广的重要渠道之一。然而,海外市场竞争激烈,想要在众多品牌中脱颖而出,就需要在社交媒体关注者的心中树立品…

javaweb监听和渲染技术

jsp入门使用 <% page import"java.io.PrintWriter" %> <%-- Created by IntelliJ IDEA.--%> <%-- User: 韩顺平--%> <%-- jsp的模板如何定制&#xff0c;一会再说明--%> <%-- To change this template use File | Settings | File T…

64位交叉编译器版本切换

操作系统版本 lkmaoubuntu:~$ cat /proc/version Linux version 5.6.18 (lkmaoubuntu) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #1 SMP Tue Jul 25 23:11:17 PDT 2023 lkmaoubuntu:~$ 64位 安装默认版本和gcc5版本。 sudo apt-get install gcc-aarch64-linux-g…

秋招打卡011(20230807)

文章目录 前言一、今天学习了什么&#xff1f;二、算法----》单调栈1、介绍2、题目 总结 前言 提示&#xff1a;这里为每天自己的学习内容心情总结&#xff1b; Learn By Doing&#xff0c;Now or Never&#xff0c;Writing is organized thinking. 今天拿到了上周面试的结果…

整理mongodb文档:集合名字有类似-等特殊字符串如何处理?

个人博客 整理mongodb文档:集合名字有类似-等特殊字符串如何处理&#xff1f; 首先&#xff0c;先创建一个collection的名字为’collection-test’&#xff0c;这个表名中&#xff0c;colletion的名字有一个特殊字符串“-”&#xff0c;但是后面插入数据的时候会有这么一个错…

SpringCloud(29):Nacos简介

1 什么是配置中心 1.1 什么是配置 应用程序在启动和运行的时候往往需要读取一些配置信息&#xff0c;配置基本上伴随着应用程序的整个生命周期&#xff0c;比如&#xff1a;数据库连接参数、启动参数等。 配置主要有以下几个特点&#xff1a; 配置是独立于程序的只读变量 …

瑞芯微RK3568核心板-4G联网测试

​ &#x1f308;引言 RK3568是瑞芯微针对AIOT和工业市场推出的一款高性能、低功耗、功能丰富的应用处理器。它采用了四核ARM架构64位Cortex-A55处理器&#xff0c;主频高达2.0GHz&#xff0c;集成瑞芯微自研1TOPS算力NPU, 同时集成Mali-G52 2EE GPU&#xff0c;支持4K60fps …

【javaSE】 万字带你认识异常

异常目录 异常的概念与体系结构异常的概念算术异常数组越界异常空指针异常 异常的体系结构 异常的分类编译时异常运行时异常 异常的处理防御式编程LBYL&#xff1a;事前防御型EAFP&#xff1a;事后认错型 异常的抛出注意事项 异常的捕获异常声明throws注意事项 try-catch捕获并…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(35)-Fiddler如何抓取微信小程序的包-下篇

1.简介 通过前边和宏哥的学习&#xff0c;我们了解到Android 7.0 之后增加了对第三方证书的限制&#xff0c;抓包工具&#xff08;charles、fiddler等&#xff09;提供的证书都无法通过校验&#xff0c;也就无法抓取HTTPS请求了&#xff0c;对测试工作影响很大。最近更新的微信…

idea导入新项目报异常:Error:java: Compilation failed: internal java compiler error

修改settings中项目对象Java编译配置恢复正常。 标记的两个地方配置修改和项目一样后&#xff0c;正常。

15年前,互联网蓬勃发展时,你是否还记得这几个标志软件?

互联网蓬勃发展了几十年里&#xff0c;创造很多经典&#xff0c;也成就了很多人物。 我们熟知的有&#xff1a;微软的创始人比尔盖茨&#xff0c;亚马逊的创始人杰夫贝索斯&#xff0c;Google的创始人拉里佩奇等。 给各行各业带来了翻天覆地的变化。 你还记得“IE”吗&#xff…

【云原生】kubernetes中容器的资源限制

目录 1 metrics-server 2 指定内存请求和限制 3 指定 CPU 请求和限制 资源限制 在k8s中对于容器资源限制主要分为以下两类: 内存资源限制: 内存请求&#xff08;request&#xff09;和内存限制&#xff08;limit&#xff09;分配给一个容器。 我们保障容器拥有它请求数量的…

【C++】做一个飞机空战小游戏(六)——给两架飞机设置不同颜色(cout输出彩色字符、结构体使用技巧)

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

docker安装neo4j

参考文章&#xff1a; 1、Mac 本地以 docker 方式配置 neo4j_neo4j mac docker_Abandon_first的博客-CSDN博客 2、https://www.cnblogs.com/caoyusang/p/13610408.html 安装的时候&#xff0c;参考了以上文章。遇到了一些问题&#xff0c;记录下自己的安装过程&#xff1a; …

ABP:BackgroundJob/Quartz 结合业务实现定时发送

需求描述&#xff1a;我在使用ABP框架&#xff0c;现在想实现一个定时任务功能&#xff0c;描述&#xff1a;每天八点调用特定接口&#xff0c;调用n次后结束不再调用。相关的数据都来自于一个特定的实体“fuck”。 解决方案&#xff1a;可以使用ABP框架自带的定时任务功能来实…

浅聊Cesium.js 后处理原理

浅聊Cesium.js 后处理原理 使用例子: const stages viewer.scene.postProcessStages;const silhouette Cesium.PostProcessStageLibrary.createSilhouetteStage() silhouette.enabled true; stages.add(silhouette);silhouette.uniforms.color Cesium.Color.LIME;涉及到相…

linux内网穿透应用场景有哪些?快解析有什么用处?

随着网络技术的不断发展&#xff0c;无论是工作上还是在生活中人们对网络的依赖和需求越来越高。Linux内网穿透作为一种创新的解决方案&#xff0c;为我们提供了无限可能。 首先我们了解一下Linux操作系统。Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基…