mysql 分表实战

news2024/12/28 21:06:04
本文主要介绍基于range分区的相关

1、业务需求,每日160w数据,每月2000w;解决大表数据读写性能问题。

2、数据库mysql 8.0.34,默认innerDB;mysql自带的逻辑分表

3、分表的目的:解决大表性能差,小表缩小查询单位的特点(其实优化的精髓就是缩小范围)

4、创建分区表-range

4.1 创建表及组合主键

CREATE TABLE `dept_test_t` (
  `dept_test_id` bigint unsigned NOT NULL COMMENT '产品二维码ID',
  `partition_field` int NOT NULL COMMENT '分区字段:yyyyMMdd',
  `created_time` datetime NOT NULL COMMENT '创建时间',
  `param` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '参数',
  PRIMARY KEY (`dept_test_id`,`partition_field`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='部门测试表'

4.2 手动创建表分区

ALTER TABLE dept_test_t PARTITION BY RANGE (partition_field) (
	PARTITION p20240222 VALUES LESS THAN (20240223),
	PARTITION p20240223 VALUES LESS THAN (20240224),
	PARTITION p20240224 VALUES LESS THAN (20240225),
	PARTITION p20240225 VALUES LESS THAN (20240226),
	PARTITION p20240226 VALUES LESS THAN (20240227),
	PARTITION p20240227 VALUES LESS THAN (20240228)	
);

查看表分区

SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,
TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='dept_test_t';

4.3、插入数据,再观察表分区

INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (1, 20240223, SYSDATE(), '6$1155ea$p1it$20240223');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (11, 20240223, SYSDATE(), '6$1155ea$p1it$20240223');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (12, 20240223, SYSDATE(), '6$1155ea$p1it$20240223');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (13, 20240224, SYSDATE(), '6$1155ea$p1it$20240224');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (14, 20240224, SYSDATE(), '6$1155ea$p1it$20240224');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (15, 20240225, SYSDATE(), '6$1155ea$p1it$20240225');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (16, 20240225, SYSDATE(), '6$1155ea$p1it$20240225');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (17, 20240226, SYSDATE(), '6$1155ea$p1it$20240226');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (18, 20240227, SYSDATE(), '6$1155ea$p1it$20240227');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (19, 20240226, SYSDATE(), '6$1155ea$p1it$20240226');
INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (20, 20240228, SYSDATE(), '6$1155ea$p1it$20240228');
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,
TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='dept_test_t';

注意:数据只能插入到已存在的分区,否则报错,存入失败

INSERT INTO `dept_test_t`(`dept_test_id`, `partition_field`, `created_time`, `param`) VALUES (20, 20240228, SYSDATE(), '6$1155ea$p1it$20240228')
> 1526 - Table has no partition for value 20240228
> 时间: 0.001s

4.4、查询效率验证

EXPLAIN select * from dept_test_t where partition_field = 20240224 and param='6$1155ea$p1it$20240224';

添加索引:

ALTER TABLE `dept_test_t` ADD INDEX `dept_n1`(`param`) USING BTREE;

走了具体的分区:p20240224 ,也走了索引:dept_n1

5、创建事件-定时创建分区

 -- 事件跟踪日志
 CREATE TABLE IF NOT EXISTS partition_event_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_name VARCHAR(100) NOT NULL,
    remark VARCHAR(200) NOT NULL,
    created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

drop EVENT `auto_add_dept_partition`;

DELIMITER ;;
CREATE EVENT IF NOT EXISTS `auto_add_dept_partition`
ON SCHEDULE EVERY 1 DAY STARTS '2023-02-22 15:04:00'
DO
BEGIN
    DECLARE cur_date DATE;
    SET cur_date = CURDATE();
    -- 根据当前日期动态生成分区名和边界值
    SET @partition_name = CONCAT('p', LPAD(DATE_FORMAT(cur_date, '%Y%m%d'), 8, '0'));
    SET @boundary_value = DATE_FORMAT(DATE_ADD(cur_date, INTERVAL 1 DAY), '%Y%m%d');
     -- 记录成功添加新分区的日志
    INSERT INTO partition_event_log (event_name, remark) VALUES ('auto_add_partition', CONCAT('Preparing to add partition for date: ', current_date));
    -- 添加新的分区
    SET @sql = CONCAT('ALTER TABLE dept_test_t ADD PARTITION (PARTITION ', @partition_name, ' VALUES LESS THAN (', @boundary_value, '))');
  
		-- 记录成功添加新分区的日志
    INSERT INTO partition_event_log (event_name, remark) VALUES ('auto_add_dept_partition', @sql);
		
		PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;		
		 
END;;
DELIMITER ;

查看event执行情况

SELECT EVENT_NAME,LAST_EXECUTED, STATUS FROM information_schema.EVENTS;

执行日志情况:

6、小结

mysql逻辑分表,

优点: 对于程序来说是透明的,你无需修改任何代码,但需要增加分区查询字段条件,否则就会变成多分区查询,增加数据库IO操作

缺点:跨分区查询统计,性能差,需要自己根据实际业务创建相关统计表;或者借助其他的实时计算中间件处理统计查询业务,比如 flink,spark等

相关链接

mysql数据表分区详细语法及性能测试_mysql分区语法-CSDN博客

mysql的分区:使用range分区_mysql range分区-CSDN博客

MySQL创建分区报错_this partition function is not allowed-CSDN博客

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

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

相关文章

人事|人事管理系统|基于Springboot的人事管理系统设计与实现(源码+数据库+文档)

人事管理系统目录 目录 基于Springboot的人事管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、员工管理 3、公告信息管理 4、公告类型管理 5、培训管理 6、培训类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、…

2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)

【EI检索】2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024) 会议简介 我们很高兴邀请您参加将在三亚举行的2024年环境安全科学、材料工程和制造国际学术会议(ESSMEM 2024)。 ESSMEM2024将汇集世界各国和地区的研究人员&…

CrackRTF1

由此可知为六位密码且<100000自动退出 发现是哈希加密&#xff0c;经过网上查找后了解到 0x8004u 为 SHA1 加密&#xff0c;故从网上寻找脚本并进行爆破 密码为123321 找到一个取巧的网站 MD5免费在线解密破解_MD5在线加密-SOMD5 Flag{N0_M0re_Free_Bugs}

Mysql索引讲解及创建

索引介绍 1.什么是索引&#xff1f; 索引是存储引擎中一种数据结构&#xff0c;或者说数据的组织方式&#xff0c;又称之为键key&#xff0c;是存储引擎用于快速找到记录的 一种数据结构。 为数据建立索引就好比是为书建目录&#xff0c;或者说是为字典创建音序表&#xff0c;…

视频号视频下载教程:如何把微信视频号的视频下载下来

视频号下载相信不少人都多少有一些了解&#xff0c;但今天我们就来细说一下关于视频号视频下载的相关疑问&#xff0c;以及大家经常会问到底如何把微信视频号的视频下载下来&#xff1f; 视频号视频下载教程 视频号链接提取器详细使用指南&#xff0c;教你轻松下载号视频&…

LabVIEW燃料电池船舶电力推进监控系统

LabVIEW燃料电池船舶电力推进监控系统 随着全球经济一体化的推进&#xff0c;航运业的发展显得尤为重要&#xff0c;大约80%的世界贸易依靠海上运输实现。传统的船舶推进系统主要依赖于柴油机&#xff0c;这不仅耗能高&#xff0c;而且排放严重&#xff0c;对资源和环境的影响…

uniapp播放mp4省流方案

背景&#xff1a; 因为项目要播放一个宣传和讲解视频&#xff0c;视频文件过大&#xff0c;同时还为了节省存储流量&#xff0c;想到了一个方案&#xff0c;用m3u8切片替代mp4。 m3u8&#xff1a;切片播放&#xff0c;可以理解为一个1G的视频文件&#xff0c;自行设置文…

Antd 嵌套子表格 defaultExpandAllRows 默认展开不生效

问题描述 在使用 antd 嵌套子表格时&#xff0c;想要默认展开所有子列表&#xff0c;设置属性:defaultExpandAllRows“true”&#xff0c;但是子列表没有展开 原因分析 defaultExpandAllRows 属性官网定义&#xff1a; 从官网定义可知&#xff0c;defaultExpandAllRows 属性…

P2680 [NOIP2015 提高组] 运输计划 第一个测试点信息 || 被卡常,链式前向星应该解决的是vector的push_back频繁扩容的耗时

[NOIP2015 提高组] 运输计划 - 洛谷 目录 测试点信息 P2680_1.in P2680_1.out 图&#xff1a; 50分参考代码&#xff08;开了n^2的数组&#xff0c;MLE了&#xff09;&#xff1a; 测试点信息 Subtask #0 #1 P2680_1.in 100 1 7 97 4 89 2 0 40 91 1 70 84 1 36 92 3 …

ASLR 和 PIE

前言 ASLR&#xff08;Address Space Layout Randomization&#xff0c;地址空间随机化&#xff09;是一种内存攻击缓解技术&#xff0c;是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。这种技术使得系统上运行的进程的内存地址无法被预测&#xff0c;使得与这些进程有…

Spring Cloud学习

1、什么是SpringCloud Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。Spring cloud 流应用程…

【Java设计模式】二、单例模式

文章目录 1、懒汉式2、双重检查3、静态内部类4、饿汉式5、枚举6、单例模式的破坏&#xff1a;序列化和反序列化7、单例模式的破坏&#xff1a;反射 单例模式即在程序中想要保持一个实例对象&#xff0c;让某个类只有一个实例单例类必须自己创建自己唯一的实例&#xff0c;并对外…

mysql的增删改查(常用)

增(insert) 语法&#xff1a; insert into 表名&#xff08;字段&#xff09; values( 字段对应的值) 案例&#xff1a; 创建一个学生表 结构如下&#xff1a; create table student(id int ,name varchar(20),age int); 向表中插入2条数据 create table student(id int ,n…

802.11局域网的 MAC 层协议、CSMA/CA

目录 802.11 局域网的 MAC 层协议 1 CSMA/CA 协议 无线局域网不能使用 CSMA/CD 无线局域网可以使用 CSMA 协议 802.11 的 MAC 层 分布协调功能 DCF 点协调功能 PCF CSMA/CA 协议的要点 2 时间间隔 DIFS 的重要性 SIFS DIFS 3 争用信道的过程 时隙长度的确定 退避…

Java+SpringBoot+Vue+MySQL构建银行客户管理新平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)

D - Square Pair 题目大意 给一长为的数组&#xff0c;问有多少对&#xff0c;两者相乘为非负整数完全平方数 解题思路 一个数除以其能整除的最大的完全平方数&#xff0c;看前面有多少个与其余数相同的数&#xff0c;两者乘积满足条件&#xff08;已经是完全平方数的部分无…

2-22 方法、面向对象、类、JVM内存、构造方法

文章目录 方法的重载面向对象类、属性和方法成员变量默认值属性JVM简单内存分析栈空间堆空间 构造方法执行过程构造器注意点 方法的重载 一个类中名称相同&#xff0c;但是参数列表不同的方法 参数列表不同是指&#xff1a; 形参类型形参个数形参顺序 面向对象 field —— …

JAVA工程师面试专题-《JVM篇》

目录 一、运行时数据区 1、说一下JVM的主要组成部分及其作用&#xff1f; 2、说一下 JVM 运行时数据区 &#xff1f; 3、说一下堆栈的区别 4、成员变量、局部变量、类变量分别存储在什么地方&#xff1f; 5、类常量池、运行时常量池、字符串常量池有什么区别&#xff1f;…

Amazon Generative AI | 基于 Amazon 扩散模型原理的代码实践之采样篇

以前通过论文介绍 Amazon 生成式 AI 和大语言模型&#xff08;LLMs&#xff09;的主要原理之外&#xff0c;在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾&#xff0c;希望内容可以更加深入。因此&#x…

软件设计师软考题目解析05 --每日五题

想说的话&#xff1a;要准备软考了。0.0&#xff0c;其实我是不想考的&#xff0c;但是吧&#xff0c;由于本人已经学完所有知识了&#xff0c;只是被学校的课程给锁在那里了&#xff0c;不然早找工作去了。寻思着反正也无聊&#xff0c;就考个证玩玩。 本人github地址&#xf…