mysql怎么分表分区吗 mysql数据库分表( 五 )


对其他数据类型的?持:
list列表多字段表分区,例如:你有一个在12个城市客户的业务, 为了销售和市场的目的, 你的组织每3个城市划分为一个区域针对LIST COLUMNS分区, 你可以基于城市的名称创建一个客户数据表并声明4个分区当你的客户在对应的这个区域:
使用日期分区
但是这种情况在日期增长到非常大的时候是很复杂的, 所以这种还是使用RANGE 分区方式比较好
??按照?个?定义的函数返回值来确定每个分区包含的数据,这个?定义函数也可以仅仅是?个字段名字
??通过PARTITION BY HASH (expr)?句来表达哈希表分区,其中的expr表达式必须返回?个整数 , 基于分区个数的取模(%)运算 。根据余数插?到指定的分区
??对哈希表分区来说只需要定义分区的个数,其他的事情由内部完成
如果没有写明PARTITIONS字段,则默认为1 , 表达式可以是整数类型字段 , 也可以是?个函数,?如
?如: CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY HASH( YEAR(col3) ) PARTITIONS 4;
如果插??条数据对应的col3为‘2005-09-15’时,则插?数据的分区计算?法为:
??与哈希表分区类似,只不过哈希表分区依赖于?定义的函数 , ?key表分区的哈希算法是依赖MySQL本身 ,  CREATE TABLE ... PARTITION BY KEY () 创建key表分区,括号??可以包含0个或者多个字段,所引?的字段必须是主键或者主键的?部分,如果括号??没有字段 , 则代表使?主键
如果表中没有主键但有唯?键 , 则使?唯?键,但唯?键字段必须定义为not null,否则报错
所引?的字段未必必须是整数类型,其他的类型也可以使?,?如:
?表分区,是在表分区的基础上再创建表分区的概念 , 每个表分区下的?表分区个数必须?致,?如:
ts表拥有三个范围分区,同时每个分区都各?有两个?分区 , 所以总共有6个分区
?表分区必须是范围/列表分区+哈希/key?表分区的组合
?表分区也可以显示的指定?表分区的名字,?如:
不同的表分区对NULL值的处理?式不同
对范围表分区来说,如果插?的是NULL值,则将数据放到最?的分区表?
对list表分区来说 , ?持NULL值的唯?情况就是某个分区的允许值中包含NULL
对哈希表分区和Key表分区来说,NULL值会被当成0值对待
通过alter table命令可以执?增加 , 删除,重新定义,合并或者拆分表分区的管理动作
对范围表分区和列表表分区来说,删除?个表分区命令如下:
删除表分区的动作不光会把分区删掉 , 也会把表分区?原来的数据给删除掉
在原分区上增加?个表分区可以通过alter table … add partition语句来完成
但对范围表分区来说,增加的表分区必须在尾部增加 , 在头部或者在中间增加都会失败:
为解决这个问题,可以使?REORGANIZE命令:
对列表表分区来说,只要新增加的分区对应的值在之前的表分区中没有出现过,就可以通过alter table… add partition来增加
当然 , 也可以通过REORGANIZE命令将之前的多个分区合并成?个或?个分区,但要保持分区值?致:
更复杂的?如将多个分区重组成多个分区:
MySQL-分区表 对底层表的封装,意味着索引也是按照分区的子表定义的,而没有全局索引 。(所以即使有唯一性索引,在不同子表中可能会有重复数据)
单表数据量超大时索引失效
将单表分区成数个区域,通过分区函数 , 可以快速地定位到数据的区域 。而且相比于索引,分区不需要额外的数据结构记录每个分区的数据,代价更低 。只需要一个简单的表达式就可以指向正确的分区

推荐阅读