当表数据达到一定的数量级时。SQL语句的查询会非常的慢。

解决问题,就要把数据拆分到不同的表里面去。这个时候,就要使用分区或者是分表的技术。

(1)分区与分表的区别
分区:mysql服务器帮助实现的数据分表功能,就是分区。
mysql把数据存储在拆分的不同表里面,对用户是无感知的,还是像一张表一样操作。

分表:是程序员,自己实现的拆表。把相同的数据,存储到不同的表里面。就是分表。
要分表的非常好,需要一定的算法功底。

(2)分区的类型
原理图

类型说明
key :指定id作为hash值,来进行划分。内部会有一定算法实现的。key可以不是整型

hash :指定整型作为hash值,来进行划分。

range :指定整型,作为范围,来进行划分。

list:指定整型,作为固定的区域,来进行划分。

(3)key分区操作
1)告诉Mysql分区,创建表操作:

2)插入数据:

查看数据:

3)查看表文件:

确定分了4张表!

4)合并分区:

alter table table_name coalesce partition 2;


查看表文件:

查看数据:

数据依然是存在的

5)添加分区:

alter table table_name add partition partitions 2;


查看数据:

数据都是还在的!
查看文件:

添加分区成功!

6)移除分区:

alter table table_name remove partitioning;


查看数据:

查看分区文件:

回到曾经平凡时候的样子!

7)总结:
分区完成之后,客户端操作,就是面对的一张表,不用去关心服务器怎么完成工作的。只要把SQL语句写好,就ok了。

强调重点:每一次的合并与添加与移动,都会进行数据的移动,这个数据移动,就会消耗IO资源。在操作这些的时候,一定要是服务器不忙的时候,我们才可以操作,不然我们的服务器就会非常的累,可能会支持不了。

(4)hash分区操作
1)创建分区表:

2)插入数据:

查看表数据:

3)查看分区文件:

4)合并分区:

alter table table_name coalesce partition 2;


查看数据:

查看分区文件:

5)添加分区:

alter table table_name add partition partitions 2;


查看数据:

查看分区文件:

6)移除分区:

alter table table_name remove partitioning;


查看数据

查看分区文件:

7)总结:
分区完成之后,客户端操作,就是面对的一张表,不用去关心服务器怎么完成工作的。只要把SQL语句写好,就ok了。
强调重点:每一次的合并与添加与移除,都会进行数据的移动,这个数据移动,就会消耗IO资源。在操作这些的时候,一定要是服务器不忙的时候,我们才可以操作,不然我们的服务器就会非常的累,可能会支持不了。

8)小结:
key | hash 分区:
添加分区:

    alter table table_name add partition partitions number(添加表的个数)

合并分区:

    alter table table_name coalesce partition number(合并表的个数)

移除分区:

alter table table_name remove partitioning;
使用分区的字段,必需是主键!
分区的时候,字段的选择?
一般情况下,要尽量让分区的表,每一张表的数量尽可能的保持一致!100W数据的表,分成2张表,尽量保持是50W一张表!
在表结构里面,什么样的字段,能够满足这样的需求,你就可以去选择这个字段,来制作分区表!

(5)range分区操作
1)创建这样的表:

2)插入数据:

查询数据:

3)查看文件:

4)插入大于90年代的值:

报错了,我们的分区并没有包含,这个值,所有请注意,我们现在一定一定要在范围分区的时候,包含所有的可能性!
5)设定一个最大的包含:

alter  table goods_range add partition(
    partition yearmax values less than MAXVALUE
);


查看文件的大小:

新的分区已经存在,并且没有数据!!!
添加数据:

查看数据:

查看文件数据大小:

6)删除分区:range里面还是有合并分区

alter table table_name drop partition 分区名;


查看文件:

查看数据:

删除之后,数据也一并被删除,所以请注意了。
7)移除分区:

alter table table_name remove partitioning;


查看数据:

查看分区文件:

8)总结:
添加分区与删除分区的时候,并不会移动数据。删除分区时候,分区里面有数据,也会一并删除。
移除还是老调性,要进行数据的移动!

分区怎么划分范围!通过对数据的分析,找出平均分配的年份方案。
(6)list分区操作
1)创建表:

2)插入数据:

查看数据:

3)查看分区文件:

4)删除分区:

alter table table_name drop partition 分区名


查看数据:

删除分区的时候,分区里面的数据,也会一并被删除,请注意了。
查看分区文件:

5)添加分区:怀念冬天,找回冬天

alter table table_name add partition (
    partition winter values in (12,1,2)
)


冬天找回来了,那冬天的数据找回来了吗?
数据是不会回来的,所有请珍惜我们的数据!

查看数据:

查看分区文件:

6)移除分区:

alter table goods_list remove partitioning;


查看数据:

查看分区文件:

7)总结:
添加分区与删除分区的时候,并不会移动数据。删除分区时候,分区里面有数据,也会一并删除。当你创建一个相同名称的分区时,分区已经是一个全新的,里面的数据不会回来了。
移除还是老调性,要进行数据的移动!

分区怎么划分指定值?找到能够平均分配的方案,即可!
8)小结:
range 与 list 分区
添加分区:
alter table table_name add partition (
partition 分区名称 values less than (整型)
或者
partition 分区名称 values in (整型,整型,整型)
)
删除分区:
alter table table_name drop partition 分区名
移除分区:
alter table table_name remove partitioning;

注意:移除分区是会进行数据的移动的;所有请注意,一定要在夜深人静的时候操作。

删除分区与添加分区,都不会进行数据操作,所有请操作的时候三思而行!

range与list也有合并分区;合并的时候,都是会进行数据移动的!