MYSQL如何按天分区,再按小时分划分子分区?

发布于 2022-09-06 03:18:40 字数 2556 浏览 35 评论 0

最终目标

由于数据库数据每天可能会达到2000~4000万条,所以按天划分分区仍然有很大的优化空间
我当前是按天分区的,希望可以帮我在这个基础上再改进为:
按天分区后,再按小时分为4~6个分区

当前代码如下:

初始表:

$time           = strtotime(date('Y-m-d'));
$pname          = 'p' . date('Ymd', $time);
$less_than_time = $time + 86400;

ALTER TABLE files PARTITION BY RANGE(id_a div 1000)     #id_a是时间戳微秒
(PARTITION {$pname} VALUES LESS THAN ({$less_than_time}))

自动分区存储过程

CREATE PROCEDURE AutoPartition()
            BEGIN
              DECLARE v_sysdate date;
              DECLARE v_mindate date;
              DECLARE v_maxdate date;
              DECLARE v_pt varchar(20);
              DECLARE v_maxval varchar(20);
              DECLARE i int;
        
              /*增加新分区*/
              SELECT FROM_UNIXTIME(max(partition_description) + 86400) AS val
              INTO   v_maxdate
              FROM   INFORMATION_SCHEMA.PARTITIONS
              WHERE  TABLE_NAME = 'files';
        
              set v_sysdate = sysdate();
        
              WHILE v_maxdate <= (v_sysdate + INTERVAL 2 DAY) DO
                SET v_pt = date_format(v_maxdate,'%Y%m%d');
                SET v_maxval = date_format(v_maxdate, '%Y-%m-%d');
                SET @sql = concat('alter table files add partition (partition p', v_pt, ' values less than(UNIX_TIMESTAMP(''', v_maxval, ''')))');
                -- SELECT @sql;
                PREPARE stmt FROM @sql;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;
                SET v_maxdate = v_maxdate + INTERVAL 1 DAY;
              END WHILE;
        
              /*删除旧分区*/
              SELECT FROM_UNIXTIME(min(partition_description)) AS val
              INTO   v_mindate
              FROM   INFORMATION_SCHEMA.PARTITIONS
              WHERE  TABLE_NAME = 'files';
        
              WHILE v_mindate <= (v_sysdate - INTERVAL 3 DAY) DO
                SET v_pt = date_format(v_mindate,'%Y%m%d');
                SET @sql = concat('alter table files drop partition p', v_pt);
                -- SELECT @sql;
                PREPARE stmt FROM @sql;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;
                SET v_mindate = v_mindate + INTERVAL 2 DAY;
              END WHILE;
            END

自动分区事件:

create event AutoPartitionEvent
        on schedule every 1 day starts '{$start_day}'
        ON COMPLETION PRESERVE ENABLE
        do
          BEGIN
            call AutoPartition();
          END

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文