MySQL表分区是MySQL提供的一种简单的数据表水平拆分方法。

分区表是一个逻辑表,它由多个物理子表组成。

目前只有 InnoDB 和 NDB 正式支持表分区。

注:表分区虽然可以缓解单表数据量过大的问题,但对于减轻数据库服务器压力的作用不大,所有请求还是在争用同一服务器的资源。

1. 创建分区表

可在创建表时指定分区方式。例:

create table t1 (

id int,

amount decimal(7,2),

tr_date date)

Partition by hash(month(tr_date))

Partitions 6;

也可以 Alter Table 设置分区。例:

alter table t1 Partition by key(id) Paritions 2;

alter table t1 Add Partition (Partition p2 values in (7,14,21));

为字段值划分区间;字段在在某个区间内的记录就被存放在对应的分区中。

create table test (

a int,

b int

)

Partition by Range columns(a,b) (

Partition p0 values less than (5,12),

Partition p3 values less than (maxvalue, maxvalue)

);

类似 Range,List是把分区字段可能的值都列举出来。

create table employee (

id int not null,

name varchar(30),

store_id int

)

Partition by List(store_id) (

Partition p_North values In (3,5,6,9,17),

Partition p_East values In (1,2,10,11,19,20),

Partition p_West values In (4,12,13,14,18),

Partition p_South values In (7,8,15,16)

);

用MySQL的Hash方法对字段进行计算,以确定分区。

create table test (c1 int, c2 char(5), c3 date)

Partition By Hash( Year(c3) )

Partitions 4;

特殊的Hash。与 Hash 类似,常规 Hash 是对 Hash方法计算所得值进行 取模 运算;Liner Hash 则采用线性2的幂运算。

MySQL官网使用手册有详细的运算步骤讲解。

与常规Hash相比:

优点:对分区的增、删、合并、拆分效率更高。

缺点:数据的分布没有常规Hash均匀。

create table test (c1 int, c2 char(5), c3 date)

Partition By Linear Hash( Year(c3)) )

Partitions 6;

2.4 Key

与 Hash 类似,Key使用的 哈希表达式/算法 是MySQL自己决定的;而且只能对列直接计算,不支持复杂的自定义表达式。

NDB Cluster 用的是 MD5(), 其它引擎用的算法与 PASSWORD()方法相同。

Linear Key 是特殊的 Key。Linear Key 与 Key 的关系 如同 Linear Hash 与 Hash 的关系。

create table test (

id int not null primary key,

name varchar(20)

)

Partition By Key()

Partitions 2;

就是对分区内还有分区。

父分区类型必须是 Range 或 List;

子分区类型必须是 Hash 或 Key。

create table test (id int, c1 date)

Partition By Range( Year(c1) )

Subpartition By Hash( To_Days(c1) )

Subpartitions 2 (

Partition p0 values less than (1990),

Partition p1 values less than (2000),

Partition p2 values less than maxvalue

);

上述示例中:

有三个一级分区,每个一级分区都有2个二级分区,一共是6个分区;

一级分区根据字段 c1 的年份值所属范围划分;

二级分区根据字段 c1 的天数 以Hash方式划分。

类似普通表,分区表也支持 Check Table、Optimize Table、Analyze Table、Repair Table。

此外,分区表还有特有的 Alter Table 扩展指令:

3.1 Rebuild

Bebuild 的效果就是,先移除分区中的所有数据记录,再重新插入。主要用于碎片整理。

alter table t1 Rebuild Partition p0, p1;

3.2 Optimize

当分区中有大量记录被删除,或对包含变长字段的表数据改动较大时,可用此指令回收未使用的空间,对分区数据文件进行碎片整理。

alter table t1 Optimize Partition p0, p1;

InnoDB 暂不支持此操作,可用 Rebuild 和 Analyze partition 代替。

3.3 Analyze

优化分区中的索引分布。

alter table t1 Analyze Partition p3;

3.4 Repair

修复腐化(corrupted)的分区。

alter table t1 Repair Partition p0,p1;

3.5 Check

检查分区是否有腐化(corrupted)。如果有腐化,可以用 Repair 指令修复。

alter table t1 Check Partition p1;

4. 分区表优点

方便对数据分而治之

可以通过删除分区来删除无用的数据。

为新增数据新开分区可以加快执行效率。

可以对分区单独优化、检查、修复、备份、恢复。

提高数据查询效率

可通过查询条件排除不符合条件的分区,提高效率。

5. 分区表缺点/限制

InnoDB 分区表不支持外键。

分区表不能引用其它表中的列作为外键;

其它表不能引用分区表中的列作为外键。

不支持全文索引(Fulltext Index)。

不支持空间类型数据(如,Point、Geometry)。

不支持对临时表分区。

分区索引不支持子查询。

分区索引对字段类型有限制。

只有 整数列 或 计算结果为整数的列表达式 可作为分区索引。(分区表达式可选函数)

不同分区类型对字段类型的要求也不同:

Key / Linear Key

除了 Text 和 Blob,其它字段类型都支持。因为 Key 的内部哈希函数可以生成整数。例:

create table t1 (c1 Enum('a','b','c'))

Partition By Key(c1)

Partitions 3;

Range、List

可用于字符串(string)、Time、Date、DateTime。不能用于 Text、Blob、Timestamp、Year。例:

create table t1 (c1 int, c2 Date)

Partition By Range Columns(c2) (

Partition p0 Values Less Than ('2001-01-01'),

Partition p1 Values Less Than (maxvalue)

);

复合分区的类型有限制。

父分区类型必须是 Range 或 List;

子分区类型必须是 Hash 或 Key。

分区表达式中涉及的列必须都是 每一唯一索引 包含的列。

不合法的分区 —— 唯一索引 uk_124 未引用 c3:

create table t1 (

c1 int, c2 int, c3 int, c4 int,

Unique Key uk_123 (c1, c2, c3),

Unique Key uk_124 (c1, c2, c4))

Partition By Hash(c1+c3) Partitions 4;

合法的分区 —— 两个唯一索引 都引用了 c1 和 c2:

create table t1 (

c1 int, c2 int, c3 int, c4 int,

Unique Key uk_123 (c1, c2, c3),

Unique Key uk_124 (c1, c2, c4))

Partition By Hash(c1+c2) Partitions 4;

只有部分存储引擎支持分区表。

表分区特性是存储引擎提供的,而非MySQL Server。

目前只有 InnoDB 和 NDB 支持表分区。其中 NDB 支持 Key(包括 Linear Key)类型的分区。

mysql 分区表 外键_【MySQL】表分区相关推荐

  1. mysql innodb 外键_只有innoDB才允许使用外键

    1.只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎. 2.注意: 1.必须使用InnoDB引擎: 2.外键必须建立索引(INDEX): 3.外键绑定关系这里使用了&qu ...

  2. mysql支持UUID做外键_多表外键下将普通的id主键更新为uuid主键

    多表外键下将普通的id主键更新为uuid主键 2019-05-20 02:45:37 来源: 晴天小雨 0 摘要:在多表外键影响和保证数据不删除的前提下,借助Flask-sqlalchemy插件及SQ ...

  3. mysql 外键引擎_对于mysql的外键和mysql的存储引擎

    存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型). ...

  4. mysql 复合外键_使用复合主键作为外键

    小编典典 该行: FOREIGN KEY (pk_studentID ) REFERENCES student(pk_studentID ), 是错的.您不能那样使用pk_studentID,这只是父 ...

  5. MySQL笔记——外键约束和表关系(一对一,多对一,多对多)

    一.外键约束 概念:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性.语法:(1)添加约束-- 创建表是添加外键约束CREATE TABLE 表名(列名 数据类型,-[CONSTRAINT ...

  6. mysql 联结主键_联结表中的复合主键 - Sequelize

    使用Sequelize和MySQL数据库,我试图在联结表中实现复合主键组合,但遗憾的是没有结果 . 我有 table : 它们与许多人有很多关系 . 在联结表user_has_project中,我想要 ...

  7. MySQL中有外键时数据表的删除方法

    直接删除grade,被引用的数据表时如下 报错 解决方法 先删除student,要引用的数据表 然后删除grade,被引用的数据表 成功

  8. mysql修改级联表数据_MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  9. mysql用外键链接两个表_可能做一个MySQL外键的两个可能的表之一?

    你所描述的是多态关联.也就是说,"外键"列包含必须存在于一组目标表之一中的id值.通常,目标表以某种方式相关,例如一些常见的数据超类的实例.您还需要外键列旁边的另一列,以便在每行上 ...

最新文章

  1. gulp html页面路径,配置gulp前端开发环境
  2. 雅虎网站页面性能优化的34条黄金守则 收藏
  3. java 运算符_详解Java表达式与运算符
  4. cas .net 重定向循环_接口测试平台接入企业cas(一)
  5. java 多字段分组_java8 stream统计、汇总、多字段分组、多个列汇总统计
  6. 开课吧Java课堂:什么是HashMap类
  7. JSP的自定义标签(三)之带标签体的标签
  8. 「兼容M1」iZotope RX 9 Advanced for Mac - 音频修复工具
  9. 虚拟机中centos7 安装过程中没有自动获取到网络
  10. 开关稳压器详解(四)-Buck降压型开关稳压器自举电路
  11. Python 入门基础
  12. Android的虚拟设备的缩写,Android虚拟设备的英语缩写是
  13. binlog2sql 安装使用
  14. vue3父传子,子传父
  15. 酷狗导致django8000端口占用
  16. 如何入门网络安全有什么条件呢?持有NISP或CISP证书可敲门
  17. CMMI3级和5级的区别
  18. java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试
  19. RK3399中IO域电压的选择
  20. MAC之自媒体相关、广告联盟、自由职业

热门文章

  1. 使用tensorboard时http://localhost:6006打不开或desktop-2a1fhsu 已拒绝连接
  2. 区块链已成主流,BATJ纷纷加速布局
  3. 程序员思维修炼读后感
  4. 人的一生会遇上的四个人
  5. 读安晓辉之《Qt Quick 核心编程》
  6. Spark SQL 快速入门系列(五)SparkSQL 访问 Hive
  7. python爬取bilibili数据_如何使用Python爬取bilibili视频(详细教程)
  8. FFmpeg源码分析:sws_scale图像缩放与图像转换
  9. uniapp小程序更换头像
  10. HTML 教程:基础标签