分区表

分区表

概念

表分区就是将一个大表按照mysq提供的几种方式,分成几个小表。
日常开发中我们经常会遇到大表的情況,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在査询和插入的时候耗时太长、性能低下,
如果涉及联合查询的情况,性能会更加糟糕。对表进行分区,目的就是减少数据库的负担,提高数据库的效率,通常来讲就是提高表的增删改查效率。
分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。
分区后,表面上还是一张表,但数据散列到多个位置了。应用程序读写的时候操作的还是大表名字,数据库系统自动去组织分区的数据。

与单个磁盘或文件系统分区相比,可以存储更多的数据。
很容易就能删除不用或者过时的数据。
些查询可以得到极大的优化。
涉及到 SUMO/COUNTO等聚合函数时,可以并行进行。
IO吞吐量更大。分区允许可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。
实际上,表的不同部分在不同的位置被存储为单独的表。

show plugins; 查看分区表 partition:ACTIVE

范围分区

通常是使用频率最高的分区,如按月份划分,这样的数据保持均匀性比较好,如果划分的均匀性不是很好,需要考虑其他分区方法。
例如,可以将一个表通过年份划分成两个分区,2001-2010年、2011-2020。

创建分区表

CREATE TABLE part_tab(
    c1 int default NULL,
    c2 varchar (30) default NULL,
    c3 date default Null
)Engine=INNODB
PARTITION BY RANGE (year(c3))
(
PARTITION p0 VALUES LESS THAN(1995),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (1997),
PARTITION p3 VALUES LESS THAN (1998),
PARTITION p4 VALUES LESS THAN (1999),
PARTITION p5 VALUES LESS THAN (2000),
PARTITION p6 VALUES LESS THAN (2001),
PARTITION p7 VALUES LESS THAN (2002),
PARTITION p8 VALUES LESS THAN (2003),
PARTITION p9 VALUES LESS THAN (2004),
PARTITION p10 VALUES LESS THAN (2010),
PARTITION p11 VALUES LESS THAN MAXVALUE
);

(0 - 1995) 走p0分区 , MAXVALUE 其他数字走p11分区

创建普通表

CREATE TABLE no_part_tab(
    c1 int default NULL,
    c2 varchar (30) default NULL,
    c3 date default Null
)Engine=INNODB;

查看分区表

SELECT
    PARTITION_name,
    PARTITION_expression,
    table_rows
FROM
    information_schema.PARTITIONS 
WHERE
    table_schema = SCHEMA () 
    AND table_name = 'part_tab';

创建函数插入数据

delimiter //
CREATE PROCEDURE load_part_tab()
    begin
    declare v int default 0;
    while v < 1000000
    do
    insert into part_tab values (v, 'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
    set v = V + 1;
    end while ;
    end //

# 两个表都插入数据
call load_part_tab(); 
insert into no_part_tab select * from part_tab;

查询

select COUNT(*) from part_tab where c3 > date '1990-01-01' and c3 < date '1995-12-31';
select COUNT(*) from no_part_tab where c3 > date '1990-01-01' and c3 < date '1995-12-31';

哈希分区

如果数据不是那么容易进行划分,通过这种方式就很灵活了。
可以将数据均匀的插入到不同的块,在并发时有利于提高效率,当无法用 Range分区时,就可以用Hash分区。

创建哈希分区

CREATE TABLE hash_tab(
    c1 int default NULL,
    c2 varchar (30) default NULL,
    c3 date default Null
)Engine=INNODB
partition by HASH(YEAR(c3))
PARTITIONS 5;

必须定在主键之上,如果没有主键定义在唯一键列上,同理不允许为 NULL;

分区列必须是正整数int类型

列表分区

当需要明确控制如何将数据进行分区时,采用这种方式。
只能进行单列分区,可以讲数据进行分组,比如按城市分区,几个城市放一起。

创建列表分区

CREATE TABLE list_tab(
    c1 int default NULL,
    c2 varchar (30) default NULL,
    c3 date default Null
)Engine=INNODB
partition by LIST(YEAR(c3))(
    PARTITION PO VALUES IN (1999,2000,2001),
    PARTITION p1 VALUES IN (2002,2003),
    PARTITION p2 VALUES IN (1995,1996,1997),
    PARTITION p3 VALUES IN (1998,2004)
);

需要注意: 年份要写全否则报错,如果添加了分区外的年份也会报错,没有像范围分区那样默认分区

复合分区

侧重于数据归档了,将上述三个组合起来用。根据业务需求的数据分布来了选择合适的组合。
CREATE TABLE fuhe_tab ( id INT , birth_day DATE)
    PARTITION BY RANGE (YEAR(birth_day))
    SUBPARTITION BY HASH(TO_DAYS(birth_day))
    (
        PARTITION P0 VALUES LESS THAN (1990)
        (
            SUBPARTITION S0,
            SUBPARTITION S1
        ),
        PARTITION p1 VALUES LESS THAN (2000)
        (
            SUBPARTITION s2,
            SUBPARTITION S3
        ),
        PARTITION p2 VALUES LESS THAN MAXVALUE
        (
            SUBPARTITION s4,
            SUBPARTITION S5
        )
    );

Subpartitioning 分区;(子分区)

删除分区表

ALTER TABLE part_tab DROP PARTITION p0;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容