MySQL 分区表 :逻辑上是一个表,物理上是由多个子表组合而成的一个表集合,每个子表相对独立,

各自存储着自己的数据和索引。这种分区表又称局部分区表。mysql暂时不支持全局分区表(各个分区

存储数据,索引存在其他对象中)

在以前的老版本(mysql5.6之前)中有一个变量

have_partitioning 开关控制着是否开启分区,默认为开启的,,mysql5.6将这个变量去掉了,

自动开启。

表分区的优点:

1.数据管理方便。单独管理某些分区,例如:删除历史数据,优化、检查、修复个别分区,备份,恢复个别分区

2.对某些特定的查询起到极大的优化作用

3.涉及到例如SUM() 和 COUNT()这样聚合函数的查询,可以很容易地进行并行处理

4.通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

5.分散热点(hotpage)

分区表的缺点:

1.每张表最大分区数为1024

2.分区函数返回值必须是int类型,mysql5.6开始可以直接对列进行分区。

3.不能使用任何外间约束。

4.所有的主键或者唯一索引必须被保函在分区表达式中。

5.在分区表达式中,不允许子查询

分区表类型:

range分区表:根据一个列的值的范围分布存储数据。

list分区表:和range分区表相似,但是list分区面向的是离散的值。

hash分区表:根据用户提供的分区表达式的返回值来进行分布存储数据。

key分区表:根据数据库提供的哈希函数来进行分区。

columns分区:可以直接使用非整型的数据进行分区但只能在range和list上使用

子分区:又称符合分区,mysql允许在range和list的分区上再进行hash或key的字分区。

range分区表:根据一个列的值的范围分布存储数据。

这种分区方式的需要用户定义分区表达式,分区临界值,而且对于分区表达式返回的值

必须是一个非负整数。如果表中定义了主键,那么分区列必须也包含在主键中。

这种分区模式常用与按月存储数据的场景中。

drop table if EXISTS tt ;

create table tt(

tid  int  not null   auto_increment ,

tname varchar(100) not null ,

tage TINYINT  default 0 ,

tadd varchar(100) default  '' ,

tel varchar(20)  default  0,

tmob varchar(20) DEFAULT '' ,

tsfz varchar(100) default  '',

taddtime datetime default now(),

primary key(tid ,taddtime))

ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION by RANGE(year(taddtime))(

PARTITION p0 VALUES less than (2009) ,

PARTITION p1 VALUES less than (2010) ,

PARTITION p2 VALUES less than  (2011) ,

PARTITION p3 VALUES less than (2012) ,

PARTITION p4 VALUES less than  MAXVALUE /*大于2012的值将会存储在p4分区中*/

)

list分区表:和range分区表相似,但是list分区面向的是离散的值。

range分区表的一些限制list分区也同样受限。

drop table if EXISTS tt ;

create table tt(

tid  int  not null   auto_increment ,

tname varchar(100) not null ,

tage TINYINT  default 0 ,

tadd varchar(100) default  '' ,

tel varchar(20)  default  0,

tmob varchar(20) DEFAULT '' ,

tsfz varchar(100) default  '',

tdeptId int default 0 ,

taddtime datetime default now(),

primary key(tid ,tdeptId))

ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION by list(tdeptId)(

partition p0 VALUES in(1,2,3),

PARTITION p1 VALUES in(4,5,6),

PARTITION p2 VALUES in(7,8,9)

)

hash分区表:根据用户提供的分区表达式的返回值来进行分布存储数据。分区表达式返回的值必须为非负整数。

然后用户指定一个分区个数,系统自动使用分区表达式的返回的非负整数除以分区数,然后取余数,存放在对应的

分区中

drop table if EXISTS tt ;

create table tt(

tid  int  not null   auto_increment ,

tname varchar(100) not null ,

tage TINYINT  default 0 ,

tadd varchar(100) default  '' ,

tel varchar(20)  default  0,

tmob varchar(20) DEFAULT '' ,

tsfz varchar(100) default  '',

tdeptId int default 0 ,

taddtime datetime default now(),

primary key(tid,taddtime))

ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION by HASH(year(taddtime))

PARTITIONS 4;

key分区表:根据数据库提供的哈希函数对给定的列进行来进行分区。和hash最大的区别在于不需要用户提供分区函数。

drop table if EXISTS tt ;

create table tt(

tid  int  not null   auto_increment ,

tname varchar(100) not null ,

tage TINYINT  default 0 ,

tadd varchar(100) default  '' ,

tel varchar(20)  default  0,

tmob varchar(20) DEFAULT '' ,

tsfz varchar(100) default  '',

tdeptId int default 0 ,

taddtime datetime default now(),

primary key(tid,taddtime))

ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION by key(taddtime)

PARTITIONS 4;

columns分区:mysql5.6可以直接使用非整型的数据进行分区但只能在range和list上使用。

在mysql5.6之前必须使用函数将列换成成整型才能对表进行分区,可以用来支持分区的常用函数有year(),to_days(),month()等。

mysql5.6开始对整列进行分区,不需要函数进行转换,但是这个功能仅仅限于range和list分区

range columns 分区

drop table if EXISTS tt ;

create table tt(

tid  int   not null   auto_increment ,

tname varchar(100) not null ,

tage TINYINT  default 0 ,

tadd varchar(100) default  '' ,

tel varchar(20)  default  0,

tmob varchar(20) DEFAULT '' ,

tsfz varchar(100) default  '',

tdeptId int default 0 ,

taddtime datetime DEFAULT now(),

PRIMARY key(tid,taddtime)

)

ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION by range COLUMNS(taddtime)(

PARTITION p0 VALUES less than ('2009-01-01') ,

PARTITION p1 VALUES less than ('2010-01-01') ,

PARTITION p2 VALUES less than ('2011-01-01'),

PARTITION p3 VALUES less than ('2012-01-01'),

PARTITION p4 VALUES less than MAXVALUE

)

list columns 分区:

drop table if EXISTS tt ;

create table tt(

tid  int   not null   auto_increment ,

tname varchar(100) not null ,

tage TINYINT  default 0 ,

tadd varchar(100) default  '' ,

tel varchar(20)  default  0,

tmob varchar(20) DEFAULT '' ,

tsfz varchar(100) default  '',

tdeptId int default 0 ,

taddtime datetime DEFAULT now(),

PRIMARY key(tid,tname)

)

ENGINE=InnoDB DEFAULT CHARSET=utf8

PARTITION by list COLUMNS(tname)(

PARTITION p0 VALUES in ('张三疯','张无忌') ,

PARTITION p1 VALUES in ('郭靖','杨康') ,

PARTITION p2 VALUES in ('李四','张三'),

PARTITION p3 VALUES in ('甲鱼','乌龟')

)

Q1:list分区中,出现定义表达式以外的值

mysql> insert into  tt(tname,tage,tadd,tel,tmob,tsfz) VALUES('朱元璋',120,'武当山' ,18099001122,'012-46319976','') ;

ERROR 1526 (HY000): Table has no partition for value from column_list

直接插入失败了,原因是mysql不知道将这条数据存储在哪个分区中。

分区管理与维护:

删除分区:

alter table tt drop PARTITION p0 ;

alter table tt drop PARTITION p0,p1 ;

note:不可以删除hash和key分区

添加分区:

range 分区:

mysql> alter table tt add  PARTITION ( PARTITION  p0 VALUES less than (2009));

ERROR 1481 (HY000): MAXVALUE can only be used in last partition definition

range分区添加分区报错了。,把maxvalues 的分区去掉

mysql> alter table tt  drop PARTITION p4 ;

Query OK, 0 rows affected (0.05 sec)

Records: 0  Duplicates: 0  Warnings: 0

添加分区,在最小临界值的前面添加分区

mysql> alter table tt

-> add  PARTITION (

-> PARTITION  p5 VALUES less than (2008)

-> );

ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition

还是报错了 ,在最大临界值的后面添加分区

mysql> alter table tt  add  PARTITION ( PARTITION  p5 VALUES less than (2013) );

Query OK, 0 rows affected (0.05 sec)

Records: 0  Duplicates: 0  Warnings: 0

成功添加分区

对range分区添加新的分区,range分区不能使用maxvalues,并且只能在最大临界值的后面添加。

list分区添加的新的分区:

alter table tt add PARTITION (PARTITION p3 VALUES in (10))

不能对hash和key分区添加新的分区

拆分分区:

Reorganizepartition关键字可以对表的部分分区或全部分区进行修改,并且不会丢失数据。分解前后分区的整体范围应该一致。

下面是一个拆分 range columns 分区的实例

将p1分区拆分p5和p6两个分区:

alter table  tt

REORGANIZE PARTITION p1 into (

PARTITION p5 VALUES less than ('2009-06-01'),

PARTITION p6 VALUES less than ('2010-01-01')

)

拆分p4最后一个分区

alter table  tt

REORGANIZE PARTITION p4 into (

PARTITION p7 VALUES less than ('2013-01-01'),

PARTITION p8 VALUES less than ('2014-01-01'),

PARTITION p9 VALUES less than MAXVALUE

)

合并p5,p6分区:

alter table tt

REORGANIZE PARTITION p5,p6  into (

PARTITION p1 VALUES less than ('2010-01-01')

)

合并p7,p8,p9分区:

alter table tt

REORGANIZE PARTITION p7,p8,p9  into (

PARTITION p4 VALUES less than MAXVALUE

)

重新定义分区表:可以利用这种方法对一张新表创建分区,而不需要另外的数据导入导出

alter table tt

PARTITION by range COLUMNS(taddtime)(

PARTITION p0 VALUES less than ('2010-01-01') ,

PARTITION p1 VALUES less than ('2010-05-01') ,

PARTITION p2 VALUES less than ('2011-01-01'),

PARTITION p3 VALUES less than ('2011-05-01'),

PARTITION p4 VALUES less than MAXVALUE

)

删除表的所有分区: #不会丢失数据,表分变成普通表

ALTER TABLE tt REMOVE PARTITIONING

重建分区:

这和先删除保存在分区中的所有记录,然后重新插入它们,具有同样的效果。它可用于整理分区碎片。

ALTER TABLE tt REBUILD PARTITION p0, p1;

优化分区:

如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB,或TEXT类型的列)作了许多修改,

可以使用“ALTER TABLE ... OPTIMIZE PARTITION”来收回没有使用的空间,并整理分区数据文件的碎片。

ALTER TABLE tt OPTIMIZE PARTITION p0, p1;

分析分区:读取并保存分区的键分布。

ALTER TABLE tt ANALYZE PARTITION p1;

修复分区:修复损坏的分区。

ALTER TABLE tt REPAIR PARTITION p0,p1;

检查分区:

ALTER TABLE tt CHECK PARTITION all;

截断分区:就是删除分区中的数据

ALTER TABLE tt TRUNCATE PARTITION p1;

置换分区:从mysql5.6之后才开始引入的,以前的老版本不支持置换分区。

将指定分区的记录置换到普通表中,普通表的定义应该与分区表相同,包括约束、索引等

ALTER TABLE tt exchange PARTITION p0 WITH TABLE t_exch;

普通表里面的数据和分区里面的数据相互交换。

查看分区表的属性:

select * from  information_schema.partitions where TABLE_SCHEMA='TestDB' and  table_name ='tt' \G   ;

在对表进行过拆分,合并,或重新定义之后 建议最好是优化一下

alter table  tt  optimize  parition all

否则 有可能从information_schema.partitions中读到的信息是错误的。

分区的基本语法以及简单管理:

分区的创建,新增,删除,合并,拆分

分区的管理

分区的相关讨论

分区性能讨论

分区的性能测试

mysql分区相关介绍

mysql分区注意事项:

函数相关:

mysql判断是否为分区表_MySQL 分区表相关推荐

  1. mysql表分区数量限制_MySQL分区表的局限和限制详解

    禁止构建 分区表达式不支持以下几种构建: 存储过程,存储函数,UDFS或者插件 声明变量或者用户变量 可以参考分区不支持的SQL函数 算术和逻辑运算符 分区表达式支持+,-,*算术运算,但是不支持DI ...

  2. mysql判断数字的函数_Mysql必读MySql判断汉字、日期、数字的具体函数

    <Mysql必读MySql判断汉字.日期.数字的具体函数>要点: 本文介绍了Mysql必读MySql判断汉字.日期.数字的具体函数,希望对您有用.如果有疑问,可以联系我们. MYSQL学习 ...

  3. MYSQL二级表的管理_MySQL分区表的管理~2

    一.维护分区 对于表的维护,我们一般有如下几种方式: CHECK TABLE, OPTIMIZE TABLE, ANALYZE TABLE和REPAIR TABLE. 而这几种方式,对于分区同样适用. ...

  4. mysql 创建分区表_Mysql分区表及自动创建分区Partition

    Range分区表建表语句如下,其中分区键必须和id构成主键和唯一键 CREATE TABLE `test1` ( `id` char(32) COLLATE utf8mb4_unicode_ci NO ...

  5. 如何创建mysql分区表_mysql分区表创建思路

    mysql分区表有range,list,hash,key,其中每个分区又有特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区.对于HAS ...

  6. mysql 获取分区的最大值_MySQL分区表测试

    MYSQL 分区表功能测试. 1.查看Mysql版本是否支持分区 SHOW VARIABLES LIKE '%partition%'; +-------------------+-------+ | ...

  7. mysql普通标转分区表_MySQL分区表到普通表互转

    由于最近总有人抱怨,数据迁移后执行SQL变慢,经过查看原来是分区导致的问题.原分区根据按月设置RANGE分区, 看到这图的时候也许有人就会发现问题....... 业务查询SQL: 从SQL上看 执行计 ...

  8. mysql8分区表_MySQL 分区表

    MySQL分区就是将一个表分解为多个更小的表.从逻辑上讲,只有一个表或一个索引,但在物理上这个表或者索引可能由多个物理分区组成.每个分区在物理上都是独立的.MySQL数据库分区类型:Range分区:行 ...

  9. mysql5.7 分区表_mysql分区表学习

    一:怎样对已有数据的表进行表分区 可以直接alter table进行修改. 如: USE dba; ALTER TABLE t3 PARTITION BY RANGE(id) ( PARTITION ...

  10. mysql 判断等于空字符串_mysql 判断null 和 空字符串

    1.在mysql中null 不能使用任何运算符与其他字段或者变量(函数.存储过程)进行运算.若使用运算数据就可能会有问题. 2.对null 的判断: 创建一个user表:id 主健 name 可以为空 ...

最新文章

  1. 有关 Session 操作的几个误区
  2. Python中datetime类错误
  3. [云炬创业管理笔记]第九章为创业成败而准备测试5
  4. ASP.NET Core 中的静态文件
  5. Netty:另一种Web(套接字)服务器
  6. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
  7. Android AlarmManager设置多个定时事件时只最后一个有效问题解决
  8. 计算机网络-交换机配置
  9. 分式求二阶导数_一道与三角零点距离有关的导数问题
  10. 深入浅出数据分析pdf
  11. 2019年保研夏令营复试经验分享(浙大软件/南大软件/南航计算机)
  12. 飞行器中传感器测量原理及测量模型
  13. Servlet学习记录2
  14. WARN Error while fetching metadata with correlation id 13 : {test=LEADER_NOT_AVAILABLE}
  15. [博学谷学习记录]超强总结,用心分享|第07节 常用的API-----笔记篇
  16. 获取当前时间戳-(Objective-C)
  17. 小技巧|CSS如何实现文字两端对齐
  18. [转]二.优秀软件的特点
  19. php读取excel效率,PhpSpreadsheet VS Box\Spout读取excel性能对比
  20. 武训离开人间已经整整一百一十五年了

热门文章

  1. 网课答案免费搜题入口
  2. c语言学生学籍查询流程图,C语言学生学籍管理系统
  3. 《惢客创业日记》2020.04.01-15(周三) 国家有难,匹夫有责(四)
  4. 世界500强和中国500强的视觉设计手册,设计圈都传遍了
  5. 树莓派4B(bullseye),傻瓜式配置镜像源和QT,cmake等环境
  6. 猫加路由加服务器加交换机怎么配置文件,光猫接交换机和路由器,怎么设置?...
  7. 视频编码格式和封装格式有哪些?视频封装格式和编码格式有什么区别?一篇弄懂
  8. 比Excel还简单的SQL语句查询
  9. JAVA proxy dns回源_常见问题 - CDN 回源配置相关问题
  10. 计算机软考集成项目管理工程师,计算机软考系统集成项目管理工程师