百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL大数据表水平分区优化的细致步骤
分享文章到:

MySQL大数据表水平分区优化的细致步骤

发布时间:08/01 来源:未知 浏览: 关键词:
本篇文章给大家带来的内容是对于MySQL大数据表水平分区优化的细致步骤,有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。? 本篇文章给大家带来的内容是对于MySQL大数据表水平分区优化的细致步骤,有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

将运转中的大表修改为分区表

本文章代码仅限于以数据工夫按月水平分区,其他需求可自行修改代码实现

1. 新建一张分区表

这张表的表字段和原表的字段一摸同样,附带分区

CREATE TABLE `metric_data_tmp`  (
    id bigint primary key auto_increment,
    metric varchar(128),
    datadt datetime not null unqine,
    value decimal(30, 6)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
partition by range (to_days(DATADT)) (
    PARTITION p201811 VALUES LESS THAN (to_days("2018-12-01")),
    PARTITION p201812 VALUES LESS THAN (to_days("2019-01-01")),
    PARTITION p201901 VALUES LESS THAN (to_days("2019-02-01")),
    PARTITION p201902 VALUES LESS THAN (to_days("2019-03-01")),
);

2. 将原表数据复制来临时表

  • 直接通过insert语句

insert into metric_data_tmp select * from metric_data;
  • 数据量非常大,可运用select into outfile, Load data file方式导出导入

SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM metric_data;
LOAD DATA INFILE 'data.txt' INTO TABLE metric_data_tmp FIELDS TERMINATED BY ',';

3. 重命名分区表和历史表:

rename table metric_data to metric_data_bak;
rename table metric_data_tmp to metric_data;

4. 通过数据库的按时任务按时主动新建下月的分区

  • 存储历程

delimiter $$
use `db_orbit`$$
drop procedure if exists `create_partition_by_month`$$
create procedure `create_partition_by_month`(in_schemaname varchar(64), in_tablename varchar(64))
begin
    # 用于推断需要新建的表分区可否已经存在
    declare rows_cnt int unsigned;
    # 要新建表分区的工夫
    declare target_date timestamp;
    #分区的名称,格局为p201811
    declare partition_name varchar(8);
        
    #要新建的分区工夫为下个月
    set target_date = date_add(now(), interval 1 month);
    set partition_name = date_format( target_date, 'p%Y%m' );
        
    # 推断要新建的分区可否存在
    select count(1) into rows_cnt from information_schema.partitions t where table_schema = in_schemaname and table_name = in_tablename and ifnull(t.partition_name, '') = partition_name;
    if rows_cnt = 0 then
        set @sql = concat(
            'alter table `', 
            in_schemaname, 
            '`.`', 
            in_tablename, 
            '`',
            ' add partition (partition ', 
            partition_name, 
            " values less than (to_days('",
            date_format(DATE_ADD(target_date, INTERVAL 1 month), '%Y-%m-01'), 
            "')) engine = innodb);" 
        );
        prepare stmt from @sql;
        execute stmt;
        deallocate prepare stmt;
     else
       select concat("partition `", partition_name, "` for table `",in_schemaname, ".", in_tablename, "` already exists") as result;
     end if;
end$$
delimiter ;
  • 新建按时任务,按时施行存储历程新建分区

DELIMITER $$
#该表所在的数据库名称
USE `db_orbit`$$
CREATE EVENT IF NOT EXISTS `generate_partition_for_metric_data`
ON SCHEDULE EVERY 1 MONTH   #施行周期,还有天、月等等
STARTS '2019-03-15 00:00:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Creating partitions'
DO BEGIN
    #调取方才新建的存储历程,首先个参数是数据库名称,第二个参数是表名称
    CALL db_orbit.create_partition_by_month('db_orbit', 'metric_data');
END$$
DELIMITER ;

5.其他

  • 查看表分区状况的SQL

select 
    partition_name part,  
    partition_expression expr, 
    partition_description descr, 
    table_rows  
from information_schema.partitions where table_name='metric_data';

以上就是MySQL大数据表水平分区优化的细致步骤的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板