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

构建生物医学知识图谱from zero to hero (5):关系抽取

现在将尝试提取医学概念之间的关系。根据经验,关系提取比命名实体提取至少难一个数量级。如果不希望命名实体链接取得完美的结果,那么关系提取技术肯定会出现一些错误。 使用zero-shot关系提取器FewRel。虽然我不建议将此模型投入生产,但它足以进行简单的演示。该模型可在H…

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

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

2240. 餐饮(最大流,拆点)

活动 - AcWing 奶牛们在吃饭方面十分挑剔。 每头奶牛都有自己喜欢的食物和饮料,并且不会食用其他不喜欢的食物和饮料。 农夫约翰为他的奶牛们做了美味的饭菜,但他忘了对照他们的喜好来检查菜单。 虽然他可能无法令所有奶牛满意,但他想给尽…

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

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

安卓11-设置HDMI分辨率流程

安卓11中从设置-显示设置hdmi分辨率流程:framework层通过jni控制底层驱动实现,标准驱动模型 packages\apps\Settings\src\com\android\settings\display\HdmiSettings.javaprivate void updateResolution(final ITEM_CONTROL control, final int index) {showWaitin…

【主题广范|见刊快】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)是一种数学理论和计算方法,用于描述两个概率分布之间的距离或者对应关系。它的核心概念是如何以最佳方式将一组资源(如质量、能量等)从一个位置传输到另一个位置。 基本概念: …

Qt 5.12.12 如何使用 cmake

首先 我们需要 Qt6 的help 这里面有所有使用cmake的说明 Qt6 help 下载地址 : 链接: https://pan.baidu.com/s/1jhwdYLtFaAa7tq5Gly0gAQ?pwd6666 提取码: 6666 然后 通过 qt creator 安装help qt-creater打开 Tools -> options -> Help -> Documentation 选择 …

MongoDB聚合运算符:$avg

$avg运算符返回给定数值的平均值 $avg可用于以下阶段: $addFields阶段(从MongoDB 3.4开始可用)$bucket阶段$bucketAuto阶段$group阶段包含$expr表达式的$match阶段$project阶段$replaceRoot阶段(从MongoDB 3.4开始可用)$replaceWith阶段(从MongoDB 4.2开始可用)$s…

【Linux】设置线程名字prctl、pthread_setname_np

1、prctl 设置线程名字 1.1 说明 prctl 对线程和进程的操作,详见:https://man7.org/linux/man-pages/man2/prctl.2.html #include <sys/prctl.h>int prctl(int option , ... /* unsigned long arg2 , unsigned long arg3 , unsigned long arg4 , unsigned long arg5…

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

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

代码随想录算法训练营day25|216.组合总和III

216.组合总和III 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 跟77题差不多&#xff0c;要搞清楚k确定了递归的深度 依旧用回溯三部…

cesium 高德路网数据加载到WGS-84坐标系,解决偏移问题

首先用到cesium.map.min.js 修改cesium.map.min.js中数据类型的瓦片路径 比如类型是img 搜索M.GCJ02ToWGS84&#xff0c;初步定位&#xff0c;确定是火星坐标系转wGS-84&#xff0c;然后修改 var S{img:"//webst{s}.is.autonavi.com/appmaptile?style6&x{x}&y{y…

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

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