mysql 分表实战

本文主要介绍基于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博客

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

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

相关文章

不做内容引流,你凭什么在互联网上赚钱?

孩子们放寒假了,待在家里不是看电视,就是拿着手机刷视频,脸上是各种欢快和满足。只是一切换到写作业模式,孩子是各种痛苦表情包,家长则是使出浑身解数,上演亲子大战。可见娱乐常常让人愉悦,而学…

MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(4)-Mongo数据仓储和工作单元模式封装

前言 上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(R…

(done) 什么是特征值和特征向量?如何求特征值的特征向量 ?如何判断一个矩阵能否相似对角化?

什么是齐次方程? https://blog.csdn.net/shimly123456/article/details/136198159 行列式和是否有解的关系? https://blog.csdn.net/shimly123456/article/details/136198215 特征值和特征向量 参考视频:https://www.bilibili.com/video/BV…

基于springboot+vue的在线宠物用品交易网站(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

uni-app 经验分享,从入门到离职(五)——由浅入深 uni-app 数据缓存

文章目录 📋前言⏬关于专栏 🎯什么是数据存储🧩数据存储——存储📌 uni.setStorage(OBJECT)📌 uni.setStorageSync(KEY,DATA) 🧩数据存储——获取📌 uni.getStorage(OBJECT)📌 uni.g…

学会如何打印菱形

打印菱形 题目描述:解法思路:解法代码运行结果: 题目描述: 输入⼀个整数n,打印对应2*n-1行的菱形图案,比如,输入7,输出如下图案,图案总共13行 解法思路: …

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利,企业的重要核心数据大多都存储在计算机服务器中,保护企业计算机服务器免遭勒索病毒攻击,是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作,依旧免不了被勒索病毒攻击…

队列的基本操作——常见队列的对比分析(c语言完整代码包含注释)

目录 一、队列 1.1基本概念 1.2基本操作 1.3 队列分类 1.3.1带头队列 1.3.2不带头队列 1.3.3 循环带头队列 1.3.4 循环不带头队列 1.3.5 总结 二、代码实现 2.1带头队列 2.2不带头队列 2.3循环带头队列 2.4循环不带头队列 一、队列 1.1基本概念 队列&#xff08…

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供…

由于找不到d3dx9_43.dll无法继续执行的解决方法,5种有效的方法

丢失d3dx9_43.dll文件可能会引发一系列运行问题,具体表现在哪些方面呢?首先,它是DirectX 9.0c的一个重要动态链接库文件,对于许多基于此版本DirectX开发的老旧或经典PC游戏至关重要。一旦缺失,可能导致这些游戏无法启动…

element ui 安装 简易过程 已解决

我之所以将Element归类为Vue.js,其主要原因是Element是(饿了么团队)基于MVVM框架Vue开源出来的一套前端ui组件。我最爱的就是它的布局容器!!! 下面进入正题: 1、Element的安装 首先你需要创建…

基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

糖尿病性视网膜病变(DR)的自动化检测和分期

糖尿病性视网膜病变(DR)的自动化检测和分期 提出背景DR的阶段及其特征 历年解法计算机视觉方法多分类方法 新的解法深度学习方法迁移学习大模型多模型集成全流程分析 总结特征1:图像分割特征2:疾病分级特征3:治疗建议生…

二进制中-1加上+1如果按照原码相加会存在什么问题?

问题描述:二进制中-1加上1如果按照原码相加会存在什么问题? 问题解答: -1加1等于-2,这明显是不对的。 因此引入反码的概念 然后再将计算后反码在取反码,得到-0,如下图所示。 -0不太精确,因此再…

美团面试:说说Java OOM的三大场景和解决方案?

美团面试:说说Java OOM的场景和解决方案? 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题&…

day05_方法

今日内容 流程控制关键字 break,continue方法 复习 1 循环的四要素 初始值控制条件循环内容迭代 2 for循环执行流程 for(初始值;控制条件;迭代){ 循环体; } 3 while和do-while什么区别 while先判断后执行dowhile是先执行再判断(先斩后奏) 4 手写代码,写出使用for循环输出1-10的…

区块链笔记(五)---德勤相关分析报告

web3.0 定义: 在《Insights into a Modern World》提出,“信息将由用户自己发布、保管、不可追溯且永远不会泄露,用户的任何行为将不需要任何中间机构来帮助传递”;用来指代一种区块链技术,可以基于“无须信任的交互…

微信小程序开发:通过wx.login()获取用户唯一标识openid和unionid

下面代码展示了 openid 的获取过程。 想获取 unionid 需要满足条件:小程序已绑定到微信开放平台账号下,不然只会返回 openid。 【相关文档】 微信小程序开发:appid 和 secret 的获取方法 wx.login({success (res) {if (res.code) {// 发起网…

【机器学习的基本术语和概念】

曾梦想执剑走天涯,我是程序猿【AK】 目录 简述概要知识图谱 简述概要 提示:简要描述文章内容,适合哪些人观看 知识图谱 样本(Sample)/实例(Instance):在机器学习中,我…

Linux中的各类时间 与 find命令的常用参数

之前研究wal日志清理的副产物,wal日志名被修改后文件的哪个时间会变?应该如何删除?由此整理一下Linux中atime、mtime、ctime的区别,以及find的常见用法。 一、 Linux中的各类时间 1. 各类时间的定义 Linux中有三种用于文件时间戳…