news 2026/4/16 15:28:10

mysql的分区表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mysql的分区表

1.SQL表创建

下面以时间范围进行创建(每月一个分区,表中创建了四个月的分区)

创建: CREATE TABLE test_table ( id INT NOT NULL AUTO_INCREMENT, content VARCHAR(255), create_time DATETIME NOT NULL, PRIMARY KEY (id, create_time) ) PARTITION BY RANGE (TO_DAYS(create_time)) ( PARTITION p20240601 VALUES LESS THAN (TO_DAYS('2024-06-01')), PARTITION p20240701 VALUES LESS THAN (TO_DAYS('2024-07-01')), PARTITION p20241801 VALUES LESS THAN (TO_DAYS('2024-08-01')), PARTITION p20240901 VALUES LESS THAN (TO_DAYS('2024-09-01')) ); 查询分区详情: SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'test_table';

2、mapper文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="*.infrastructure.mapper.TestTableMapper"> <resultMap id="TestTable" type="*.domain.entity.TestTable"> <id column="id" property="id" typeHandler="org.apache.ibatis.type.LongTypeHandler"/> <result property="content" column="content" jdbcType="VARCHAR"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP" typeHandler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/> </resultMap> <!-- 创建新分区 --> <update id="createNewPartition"> ALTER TABLE TEST_TABLE ADD PARTITION ( PARTITION ${partitionName} VALUES LESS THAN (TO_DAYS(#{lessThanValue})) ) </update> <!-- 删除旧分区 --> <update id="dropPartition"> ALTER TABLE TEST_TABLE DROP PARTITION ${partitionName} </update> <!--查询是否存在分区--> <select id="exitsPartition" resultType="boolean"> SELECT COUNT(1) > 0 FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'TEST_TABLE' AND PARTITION_NAME = #{partitionName} </select> </mapper>

3、service

package *.domain.service; import *.domain.entity.TestTable; import *.infrastructure.repo.TestTableRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.Random; @Service public class TestTableService { @Autowired TestTableRepository repository; // 插入数据,如果分区不存在,就创建分区,重新插入 public void insert() { TestTable testTable = new TestTable(); testTable.setContent("test"); Random random = new Random(); int i = Math.abs(random.nextInt()) % 365; LocalDateTime dateTime = LocalDateTime.now().minusDays(i); testTable.setCreateTime(dateTime); try { repository.getBaseMapper().insert(testTable); } catch (DataAccessException e) { LocalDate nextMonthFirstDay = YearMonth.from(dateTime).plusMonths(1).atDay(1); String lessThanValue = nextMonthFirstDay.format(DateTimeFormatter.ISO_DATE); String partitionName = "p" + lessThanValue.replaceAll("-", ""); // 创建分区时加锁,如果是多节点,需要分布式锁 synchronized (this) { if (!repository.getBaseMapper().exitsPartition(partitionName)) { repository.getBaseMapper().createNewPartition(partitionName, lessThanValue); } } repository.getBaseMapper().insert(testTable); } } // 创建分区 public void createNewPartition(String partitionName, String lessThanValue) { repository.getBaseMapper().createNewPartition(partitionName, lessThanValue); } // 删除分区 public void dropPartition(String partitionName) { repository.getBaseMapper().dropPartition(partitionName); } }

----------------分割线-------------------------------

上述方法用代码来判断分区,新增分区,可能会引入一些奇奇怪怪的问题,因此,优化如下:

【针对mysql,使用mysql的定时事件】

1、首先确认mysql的时间调度器是否已经开启:

-- 查询事件调度器是否开启 SHOW VARIABLES LIKE 'event_scheduler'; -- 确保事件调度器已经开启 SET GLOBAL event_scheduler = ON;

2、写存储过程,用于创建新的分区, 这里是按天创建新的分区

DELIMITER // CREATE PROCEDURE `AddDailyPartition`() BEGIN DECLARE tomorrow DATE; DECLARE partition_name VARCHAR(20); -- 计算明天的日期 SET tomorrow = DATE_FORMAT(CURDATE() + INTERVAL 1 DAY, '%Y-%m-%d'); SET partition_name = CONCAT('p', DATE_FORMAT(tomorrow, '%Y%m%d')); -- 构建ALTER TABLE语句来添加分区 SET @sql = CONCAT('ALTER TABLE TEST_TABLE ', 'ADD PARTITION (PARTITION ', partition_name, ' VALUES LESS THAN (TO_DAYS('', tomorrow, '')))'); -- 执行ALTER TABLE语句 PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END // DELIMITER ;

3、创建定时事件,调用存储过程

-- 创建定时事件 CREATE EVENT `CreateDailyPartition` ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURDATE()) DO CALL AddDailyPartition();

4、查看已经创建的定时事件

SELECT * FROM information_schema.EVENTS; 在查看事件时,重要的列包括: EVENT_NAME: 事件的名称。 EVENT_SCHEMA: 事件所属的数据库。 STATUS: 事件的状态,比如是否为ENABLED或DISABLED。 STARTS: 事件开始的时间。 ENDS: 事件结束的时间(如果有设置的话)。 LAST_EXECUTED: 事件上一次执行的时间。 EVENT_DEFINITION: 事件定义,即事件中要执行的SQL语句。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:45:21

Linux 操作系统简介

Linux 操作系统简介 本文围绕 Linux 操作系统的定义、历史、核心特征、架构、发行版、应用领域、优势与挑战等方面。 1. 定义与核心理念 Linux 严格来说指的是 Linux内核 —— 一个由林纳斯托瓦兹于1991年创立的、开源且免费的类Unix操作系统内核。它负责管理系统的核心资源&am…

作者头像 李华
网站建设 2026/4/16 10:52:44

通信原理篇

核心思想升级&#xff1a;从“送单词”到“送句子”在之前的基础调制&#xff08;ASK、FSK、BPSK&#xff09;中&#xff0c;我们一次只送1个比特&#xff08;一个0或一个1&#xff09;。这就像每次派一架飞机&#xff0c;只送一个字母&#xff0c;效率太低了。高阶调制的目标就…

作者头像 李华
网站建设 2026/4/16 4:30:56

会议室 II:为什么这个“看起来很简单”的题,能筛掉一大票算法选手?

会议室 II:为什么这个“看起来很简单”的题,能筛掉一大票算法选手? 大家好,我是 Echo_Wish。 今天我们聊一道算法圈的老熟人——Meeting Rooms II(会议室 II)。 这题在 LeetCode 里不算难,面试里却杀伤力十足。 原因只有一个: 它考的不是你会不会写代码,而是你会不会…

作者头像 李华
网站建设 2026/4/15 20:11:25

《庄子》导读

《庄子》是战国时期道家学派的经典著作&#xff0c;由庄周及其后学共同撰写&#xff0c;全书现存 33 篇&#xff0c;分为内篇 7 篇、外篇 15 篇、杂篇 11 篇。学界普遍认为&#xff0c;内篇为庄子本人所著&#xff0c;集中体现核心思想&#xff1b;外篇、杂篇多为弟子及后学阐发…

作者头像 李华
网站建设 2026/4/16 13:04:37

千寻运动助手V3.1小程序源码 全开源版

会员积分流量主自动化任务全功能上线基于PHPMySQL的运动步数管理助手&#xff0c;支持VIP自动任务、积分体系、流量主变现&#xff0c;打造专属健康运动小程序项目简介&#xff1a;运动健康领域的全能助手在全民健身和数字化健康管理的时代背景下&#xff0c;一款能够激励用户运…

作者头像 李华
网站建设 2026/4/16 14:50:35

Python轮子使用:.whl原理与安装指南

前言 在Python的世界里&#xff0c;“不要重复造轮子”是著名的开发哲学。但比这更重要的是——你得知道如何拿到并使用别人造好的“轮子”。 当网络受限或环境复杂导致pip install失败时&#xff0c;.whl文件便是为你准备好的、即拿即用的“轮子”。本文将清晰解析其工作原理…

作者头像 李华