mysql 按年分区

CREATE TABLE `sunmnet_visit_record` (
`id`  bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID' ,
`ip`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'ip地址' ,
`browser`  varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '浏览器' ,
`kernel_version`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '内核版本' ,
`name`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网站名称' ,
`address`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '网站地址' ,
`duration`  int(11) NULL DEFAULT NULL COMMENT '响应时长(毫秒)' ,
`status`  int(1) NOT NULL DEFAULT 0 COMMENT '响应状态(0:正常 1:超时)' ,
`create_date`  datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间(抓取时间)' ,
`update_date`  datetime NULL COMMENT '修改时间' ,
PRIMARY KEY (`id`, `create_date`)
)PARTITION BY RANGE (YEAR(create_date))(
	PARTITION p2018 VALUES LESS THAN (2019),
	PARTITION p2019 VALUES LESS THAN (2020)
);

通过sql新增数据,之后查看数据保存在对应的分区条数

SELECT
	partition_name,
	partition_expression,
	partition_description,
	table_rows
FROM
	information_schema. PARTITIONS
WHERE
	table_schema = SCHEMA ()
AND table_name = 'sunmnet_visit_record'

给表添加新的分区

ALTER TABLE sunmnet_visit_record ADD PARTITION(PARTITION p2020 VALUES LESS THAN (2021));

删除表分区

ALTER TABLE sunmnet_visit_record DROP PARTITION p2019

写个存储过程,自动添加分区

drop  PROCEDURE `add_partition_by_year`;
CREATE PROCEDURE `add_partition_by_year` ()
	BEGIN
		
		DECLARE next_year int;
		DECLARE cur_name VARCHAR(10);
		DECLARE exist_procedure_name int;
		DECLARE limit_year int;
		SET next_year = YEAR(CURRENT_DATE())+1;
		SET limit_year = next_year + 1;
		SET cur_name = 'p'+ next_year;
		
		SELECT
			count(*) INTO exist_procedure_name
		FROM
			information_schema.PARTITIONS
		WHERE
			table_schema = SCHEMA ()
		AND table_name = 'sunmnet_visit_record'
		AND PARTITION_NAME = cur_name;
		
		IF exist_procedure_name = 0 THEN
			SET @addSql=CONCAT('ALTER TABLE sunmnet_visit_record ADD PARTITION (PARTITION ',cur_name,' VALUES LESS THAN (',limit_year,'));');
			SELECT @addSql;
			PREPARE stmt FROM@addSql;
			EXECUTE stmt;
		END IF;
	COMMIT;
END;

定时器事件创建,一个月调用一次

CREATE EVENT
IF NOT EXISTS addPartitionJob ON SCHEDULE EVERY 1 MONTH ON COMPLETION PRESERVE DO
	CALL add_partition_by_year();

至此所有的准备工作已经写完了,做完这些,mysql要想利用定时器必须的做准备工作,就是把mysql的定时器给开启了:
SET GLOBAL event_scheduler = 1;  -- 启动定时器
SET GLOBAL event_scheduler = 0;  -- 停止定时器


紧接着还要开启事件:
ALTER EVENT eventJob ON  COMPLETION PRESERVE ENABLE;   -- 开启事件
ALTER EVENT eventJob ON  COMPLETION PRESERVE DISABLE;  -- 关闭事件

SHOW VARIABLES LIKE '%sche%'; -- 查看定时器状态

### MySQL 表按分区存储方法 在MySQL中,可以通过`RANGE`分区方式按照日期字段来实现每的数据存放在不同的分区内。这种方式特别适用于处理大量历史数据的情况。 创建一个基于份范围分区的表结构如下所示: ```sql CREATE TABLE sales ( id INT NOT NULL, sale_date DATE NOT NULL, amount DECIMAL(10, 2), PRIMARY KEY(id) ) PARTITION BY RANGE (YEAR(sale_date))( PARTITION p_2022 VALUES LESS THAN (2023), PARTITION p_2023 VALUES LESS THAN (2024), PARTITION p_future VALUES LESS THAN MAXVALUE ); ``` 上述SQL语句定义了一个名为`sales`的表格,并设置了三个初始分区:分别对应2022的销售记录、2023的销售记录以及未来所有未指定具体份之前的记录[^5]。 对于新一的到来或者为了提前规划未来的空间需求,可以预先增加新的分区以容纳即将到来度内的新增数据条目。这可通过`ALTER TABLE...ADD PARTITION`命令完成,例如要为2024准备一个新的分区,则可执行下面的操作[^2]: ```sql ALTER TABLE sales ADD PARTITION ( PARTITION p_2024 VALUES LESS THAN (2025) ); ``` 当不再需要保存某些较早时期的全部交易明细时,可以直接移除对应的旧分区而无需逐行删除单个记录项,从而简化维护工作并提升性能表现。比如如果决定清除掉有关2022的所有资料,那么只需简单地发出一条指令即可达成目的: ```sql ALTER TABLE sales DROP PARTITION p_2022; ``` 此外,在设计查询逻辑的时候也可以充分利用这种特性——即让数据库引擎能够快速判断哪些部分可能包含满足条件的结果集,进而减少不必要的磁盘I/O操作次数,加快检索速度。例如,当询问特定商店在过去某个月份内发生的订单总量时,系统可以根据给定的时间区间参数自动锁定目标区域而不必遍历整个集合中的每一个成员对象[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值