欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql event

程序员文章站 2022-04-27 13:17:07
...

 

fdate按日期分区

create table myevent
(
	fdate int(11) not null default '0',
	appid int,
	primary key(fdate)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE(TO_DAYS(fdate))
(PARTITION p20190217 VALUES LESS THAN (TO_DAYS('2019-02-17')) ENGINE = InnoDB,
PARTITION p20190218 VALUES LESS THAN (TO_DAYS('2019-02-18')) ENGINE = InnoDB);

 如果fdate非date类型,会报错:

 1486 - Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed

 

添加或删除分区 

ALTER TABLE myevent ADD PARTITION (PARTITION p20190219 VALUES LESS THAN (TO_DAYS('20190219')));
ALTER TABLE myevent DROP PARTITION p20190219;

 

查看使用分区数

explain PARTITIONS select * from myevent;

+----+-------------+---------+-------------------------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table   | partitions                    | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+---------+-------------------------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | myevent | p20190217,p20190218,p20190219 | ALL  | NULL          | NULL | NULL    | NULL |    1 |      100 | NULL  |
+----+-------------+---------+-------------------------------+------+---------------+------+---------+------+------+----------+-------+

 

判断分区是否存在:

SELECT count(1) from INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = schema() 
AND TABLE_NAME='myevent' AND partition_name='p20190220';

   

 

上述分区需要预配置,可以用event来实现每天自动创建分区。

开启event

SHOW VARIABLES LIKE '%event_sche%';
SET GLOBAL event_scheduler = 1;

  

创建定时任务

DROP EVENT if exists myevent_auto_partition;
DELIMITER  $$
CREATE EVENT myevent_auto_partition
ON SCHEDULE 
    EVERY 1 DAY
    STARTS '2019-03-01 00:00:00'
    COMMENT '天表每天自动增加分区'
   DO
BEGIN
set @c_table='myevent';
set @c_day=curdate();
set @p_c_day=DATE_FORMAT(NOW(), '%Y%m%d');
set @p_name=concat('p', @p_c_day);
set @p_sql=concat('ALTER TABLE ', @c_table,' ADD PARTITION (PARTITION ', @p_name,' VALUES LESS THAN (TO_DAYS ("', @c_day, '")))');
SELECT @p_sql;
PREPARE stmt from @p_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END  $$
DELIMITER ;

 

查看计划任务

show events;

drop event if exists myevent_auto_partition;

 

查询所有事件sql

select * from mysql.event;

 

 

 

 

 

 

 

 

相关标签: partition event