美文网首页
Mysql分区表

Mysql分区表

作者: PyKailyn | 来源:发表于2017-04-23 19:43 被阅读0次

    创建分区表

    CREATE TABLE `partition_table_name` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `uid` varchar(64) NOT NULL,
      `id_card_num` varchar(20) NOT NULL,
      `name` varchar(100) NOT NULL,
      `phone_num` varchar(30) NOT NULL,
      `create_time` datetime DEFAULT NULL,
      PRIMARY KEY (`id`, `create_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    PARTITION BY RANGE ((year(create_time)*100+month(create_time))*100+day(create_time)) (
        PARTITION p20170411 VALUES LESS THAN (20170412),
        PARTITION s20170412 VALUES LESS THAN (20170413)
    );
    

    以上sql语句中,上半部分为普通的建表语句,唯一需要注意的是,需要把分区字段加入到PRIMARY KEY中。

    下半部分sql语句则是创建表的各个分区,以上语句是按照create_time字段进行range类型的分区。(year(create_time)*100+month(create_time))*100+day(create_time)所得的值为range分区的VALUES,值类似于"20170411"这样的int整数。PARTITION p20170411 VALUES LESS THAN (20170412)则表示创建了name为p20170411的分区,当对此表(partition_table_name)执行插入语句时,当插入数据的create_time < “2017-04-12”时,该条数据将被写入到p20170411分区表中。

    向表中插入数据时,若数据的create_time字段匹配到自己应该被放入哪个分区,则插入会失败并报错。

    p20170411这样的分区表名可随意取,但任然建议有一定的名称代表意义。

    向分区表中增加分区

    ALTER TABLE bd_black_result
     ADD PARTITION (PARTITION s20170413 VALUES LESS THAN (20170414));
    

    增加的分区必须严格按照递增的条件才能添加成功。如,不能ADD PARTITION (PARTITION s20170410 VALUES LESS THAN (20170411));只能 ADD PARTITION (PARTITION s20170413 VALUES LESS THAN (20170414));或20170415或20170416……


    查看分区情况

    select
      partition_name,  
      partition_expression,  
      partition_description,  
      table_rows
    from information_schema.partitions where
    table_name='partition_table_name'
    

    查询结果将展示该表各个分区表的情况,包括各个分区表中的数据条数。


    删除分区表

    alter table partition_table_name drop partition p20170412;
    

    删除partition_table_name表中名称为p20170412的分区表。同时,其数据也被删除。


    删除分区数据

    delete from partition_table_name PARTITION (p20170412)
    

    删除partition_table_name中分区名称为p20170412的所有数据

    当然,还可以有其他各种操作指定分区表的方法,如

    select * from partition_table_name PARTITION (p20170412);
    .
    .
    .
    

    疑问
    过程中,发现当数据量大的时候

    select
      partition_name,  
      partition_expression,  
      partition_description,  
      table_rows
    from information_schema.partitions where
    table_name='partition_table_name'
    

    以上语句统计出的p20170412分区的table_rows数据和以下语句统计出的有一定差别

    select count(*) from partition_table_name PARTITION (p20170412);
    

    原因暂不知。

    相关文章

      网友评论

          本文标题:Mysql分区表

          本文链接:https://www.haomeiwen.com/subject/uflyzttx.html