当前位置:   article > 正文

mysql 按年分区

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

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

  1. SELECT
  2. partition_name,
  3. partition_expression,
  4. partition_description,
  5. table_rows
  6. FROM
  7. information_schema. PARTITIONS
  8. WHERE
  9. table_schema = SCHEMA ()
  10. 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

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

  1. drop PROCEDURE `add_partition_by_year`;
  2. CREATE PROCEDURE `add_partition_by_year` ()
  3. BEGIN
  4. DECLARE next_year int;
  5. DECLARE cur_name VARCHAR(10);
  6. DECLARE exist_procedure_name int;
  7. DECLARE limit_year int;
  8. SET next_year = YEAR(CURRENT_DATE())+1;
  9. SET limit_year = next_year + 1;
  10. SET cur_name = 'p'+ next_year;
  11. SELECT
  12. count(*) INTO exist_procedure_name
  13. FROM
  14. information_schema.PARTITIONS
  15. WHERE
  16. table_schema = SCHEMA ()
  17. AND table_name = 'sunmnet_visit_record'
  18. AND PARTITION_NAME = cur_name;
  19. IF exist_procedure_name = 0 THEN
  20. SET @addSql=CONCAT('ALTER TABLE sunmnet_visit_record ADD PARTITION (PARTITION ',cur_name,' VALUES LESS THAN (',limit_year,'));');
  21. SELECT @addSql;
  22. PREPARE stmt FROM@addSql;
  23. EXECUTE stmt;
  24. END IF;
  25. COMMIT;
  26. END;

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

  1. CREATE EVENT
  2. IF NOT EXISTS addPartitionJob ON SCHEDULE EVERY 1 MONTH ON COMPLETION PRESERVE DO
  3. 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%'; -- 查看定时器状态

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/623877
推荐阅读
相关标签
  

闽ICP备14008679号