MYSQL如何按天分区,再按小时分划分子分区?
最终目标
由于数据库数据每天可能会达到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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论