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
BEGINDECLARE 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.mzph.cn/news/698305.shtml

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

相关文章

鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解

MouseBoost Pro mac版是一款简单实用的鼠标右键助手专业版,MouseBoost Pro for Mac只要轻点你的鼠标右键,就可以激活你想要的各种功能,让你的工作效率大幅度提高,非常好用。 软件下载:MouseBoost PRO for Mac v3.3.6中…

Gemma模型论文详解(附源码)

原文链接:Gemma模型论文详解(附源码) 1. 背景介绍 Gemma模型是在2023.2.21号Google新发布的大语言模型, Gemma复用了Gemini相同的技术(Gemini也是Google发布的多模态模型),Gemma这次发布了了2B和7B两个版本的参数,不…

如何快速卸载windows电脑的一些软件?

本系列是一些电脑常规操作的普及,有需要借鉴即可 注:每个电脑都会有差异,参考即可。 其实大部分软件你删除桌面上的图标不等于删除,因为桌面上的那个图标就是一个简单的快捷方式而已。 在这里插入图片描述 那如何正确的卸载软件呢…

Android 广播的基本概念

一.广播简介 Broadcast是安卓四大组件之一。安卓为了方便进行系统级别的消息通知,引入了一套广播消息机制。打个比方,记得原来在上课的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦…

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

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

《Solidity 简易速速上手小册》第4章:智能合约的设计与开发(2024 最新版)

文章目录 4.1 合约结构和布局4.1.1 基础知识解析深入合约布局原则理解组织结构高效布局的重要性4.1.2 重点案例:构建一个在线商店合约案例 Demo:编写在线商店智能合约案例代码:OnlineStore.sol测试和验证拓展功能4.1.3 拓展案例 1:可升级的合约案例 Demo:创建可升级的智能…

【主题广范|见刊快】2024年科技,绿色能源和可持续发展国际会议(ICTGESD 2024)

【主题广范|见刊快】2024年科技,绿色能源和可持续发展国际会议(ICTGESD 2024) 2024 International Conference on Technology, Green Energy, and Sustainable Development ⊙会议简介: 2024年科技,绿色能源和可持续发…

音视频技术-声反馈啸叫的产生与消除

目录 1.均衡调节: 2.移频法: 3.移相法: 4.比较法: 在扩音系统中,产生啸叫危害很大,一方面影响会议、演出等活动的正常进行,另一方面严重的啸叫会导致音响设备的损坏。 “啸叫”是“声反馈”的俗称,形成的机制复杂,消除的手段多样,专业调音师也对

Unity中URP实现水效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片,使其倾斜一个角度,来模拟水底和岸边的效果2、随便创建几个物体,作为与水面接触的物体3、再新建一个面片,作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

最优传输(Optimal Transport)

最优传输(Optimal Transport)是一种数学理论和计算方法,用于描述两个概率分布之间的距离或者对应关系。它的核心概念是如何以最佳方式将一组资源(如质量、能量等)从一个位置传输到另一个位置。 基本概念: …

Java编程实战:构建医疗信息管理新平台

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

sql注入 [极客大挑战 2019]FinalSQL1

打开题目 点击1到5号的结果 1号 2号 3号 4号 5号 这里直接令传入的id6 传入id1^1^1 逻辑符号|会被检测到,而&感觉成了注释符,&之后的内容都被替换掉了。 传入id1|1 直接盲注比较慢,还需要利用二分法来编写脚本 这里利用到大佬的脚…

英伟达推出免训练,可生成连贯图片的文生图模型

目前,多数文生图模型皆使用的是随机采样模式,使得每次生成的图像效果皆不同,在生成连贯的图像方面非常差。 例如,想通过AI生成一套图像连环画,即便使用同类的提示词也很难实现。虽然DALLE 3和Midjourney可以对图像实现…

linux0.11 源码阅读 head.s setup.s bootsect.s加载位置

从github上下载linux0.11源码 linux0.11源码 将0x10000处的代码往下复制到0开始的地址处。 移动后的内存布局如下 setup中存在gdt和idt的相关数据。此时需要用gdtr和idtr寄存器指向对应的数据。 实模式下,访问内存方式。最多访问1M内存。

有哪些适合程序员的副业?

如果你经常玩知乎、看公众号(软件、工具、互联网这几类的)你就会发现,好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如:天涯神贴,基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下,迅雷…

人工智能 — 图像滤波器

目录 一、图像噪声1、高斯噪声2、椒盐噪声3、泊松噪声4、乘性噪声5、瑞利噪声6、伽马噪声 二、图像滤波三、各种滤波器1、均值滤波2、中值滤波3、最大最小值滤波4、引导滤波 四、图像增强1、点处理1、线性变换2、分段线性变换3、对数变换4、幂律变换/伽马变换 2、领域处理3、图…

2006-2021年地级市资本存量数据(含原始数据+计算过程+计算结果)(以2006年为基期)

2006-2021年地级市资本存量数据(含原始数据计算过程计算结果)(以2006年为基期) 1、时间:2006-2021年 2、来源:城市年鉴、统计年鉴、各省年鉴、各市年鉴和公报、2017-2021年利用固定资产投资增速计算获取 …

【C语言】内存操作,内存函数篇---memcpy,memmove,memset和memcmp内存函数的使用和模拟实现【图文详解】

欢迎来CILMY23的博客喔,本篇为​【C语言】内存操作,内存函数篇---memcpy,memmove,memset和memcmp内存函数的使用和模拟实现【图文详解】,图文讲解四种内存函数,带大家更深刻理解C语言中内存函数的操作&…

WooCommerce商品采集与发布插件

如何采集商品或产品信息,并自动发布到Wordpress系统的WooCommerce商品? 推荐使用简数采集器,操作简单方便,且无缝衔接WooCommerce插件,快速完成商品的采集与发布。 简数采集器的智能自动生成采集规则和可视化操作功能…

Pytorch学习(杂知识)

Mini-batch Mii-batch是一种在机器学习中常用的训练算法。它是将大的数据集分成一些小的数据集,每次只用一个小的数据集来训练模型。通常情况下,训练数据集中的数据越多,训练出的模型越准确,但是如果数据集太大,就会导…