Mysql分区表

2017-04-23  本文已影响0人  PyKailyn

创建分区表

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);

原因暂不知。

上一篇下一篇

猜你喜欢

热点阅读