简单来说,分区表就是把物理表结构相同的几张表,通过一定算法,组成一张逻辑大表。这种算法叫“分区函数”,当前 MySQL 数据库支持的分区函数类型有 RANGE、LIST、HASH、KEY、COLUMNS。

无论选择哪种分区函数,都要指定相关列成为分区算法的输入条件,这些列就叫“分区列”。另外,在 MySQL 分区表中,主键也必须是分区列的一部分,不然创建分区表时会失败,比如:

CREATE TABLE t1
(a INT,b INT,c DATETIME(6),d VARCHAR(32),e INT,PRIMARY KEY (a, b)
)PARTITION BY RANGE COLUMNS (c) (PARTITION p0000 VALUES LESS THAN ('2019-01-01'),PARTITION p2019 VALUES LESS THAN ('2020-01-01'),PARTITION p2020 VALUES LESS THAN ('2021-01-01'),PARTITION p9999 VALUES LESS THAN (MAXVALUE));

报错

A PRIMARY KEY must include all columns in the table's partitioning function

上面创建了表 t1,主键是复合索引,由列 a、b 组成。表 t 创建分区表的意图是根据列 c(时间列)拆分数据,把不同时间数据存放到不同分区中。

而我们可以从错误的提示中看到:分区表的主键一定要包含分区函数的列。所以,要创建基于列c 的数据分片的分区表,主键必须包含列 c,比如下面的建表语句:

CREATE TABLE t1
(a INT,b INT,c DATETIME,d VARCHAR(32),e INT,PRIMARY KEY (a, b, c),KEY idx_e (e)
)partition by range columns (c) (PARTITION p0000 VALUES LESS THAN ('2019-01-01'),PARTITION p2019 VALUES LESS THAN ('2020-01-01'),PARTITION p2020 VALUES LESS THAN ('2021-01-01'),PARTITION p9999 VALUES LESS THAN (MAXVALUE));

创建完表后,在物理存储上会看到四个分区所对应 ibd 文件,也就是把数据根据时间列 c 存储到对应的 4 个文件中:

t#p#p0000.ibd  t#p#p2019.ibd  t#p#p2020.ibd  t#p#p9999.ibd

所以,你要理解的是:MySQL 中的分区表是把一张大表拆成了多张表,每张表有自己的索引,从逻辑上看是一张表,但物理上存储在不同文件中

另外,对于唯一索引的实现,可能和你原本的理解有些不同,我们接着往下看。

分区表注意事项:唯一索引

在 MySQL 数据库中,分区表的索引都是局部,而非全局。也就是说,索引在每个分区文件中都是独立的,所以分区表上的唯一索引必须包含分区列信息,否则创建会报错,比如:

ALTER TABLE t1 ADD UNIQUE KEY idx_d(d);
A UNIQUE INDEX must include all columns in the table's partitioning function

你可以看到错误提示: 唯一索引必须包含分区函数中所有列。而下面的创建才能成功:

ALTER TABLE t1 ADD UNIQUE KEY idx_d(d,c);

但是,正因为唯一索引包含了分区列,唯一索引也就变成仅在当前分区唯一,而不是全局唯一了。那么对于上面的表 t1,插入下面这两条记录都是可以的:

INSERT INTO t1 VALUES
(1,1,'2021-01-01','aaa',1),
(1,1,'2020-01-01','aaa',1);
SELECT * FROM t1;

你可以看到,列 d 都是字符串‘aaa’,但依然可以插入。这样带来的影响是列 d 并不是唯一的,所以你要由当前分区唯一实现全局唯一。

那如何实现全局唯一索引呢? 和之前表结构设计时一样,唯一索引使用全局唯一的字符串(如类似 UUID 的实现),这样就能避免局部唯一的问题。

总结

  • 分区表的主键一定要包含分区函数的列
  • 分区表的唯一索引不是全局唯一,而是每个分区唯一

Mysql分区表的使用相关推荐

  1. mysql 分区表 归档_MySQL分区表

    1,MySQL分区表作用 当单表的数据量较大,需要进行定期的数据归档删除时,或者提高查询性能,都可以采用分区: 2,分区表设置 分区的种类 range分区 list分区 hash分区 key分区 ra ...

  2. 数据切分——Mysql分区表的管理与维护

    关于Mysql分区表的介绍可以参考: http://blog.csdn.net/jhq0113/article/details/44592865 关于Mysql分区表的创建可以参考: http://b ...

  3. 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考: http://blog.csdn.net/jhq0113/article/details/43812895 Mysql分区表的介绍可以参考: http://blog.c ...

  4. 简述MySQL分区表类型

    分区是将一个表的数据按照某种方式,比如按照时间上的月份,分成多个较小的,更容易管理的部分,但是逻辑上仍是一个表.我们在此之前已经讲过MySQL分区表的原理,分区有利于管理非常大的表,它采用分而治之的逻 ...

  5. Mysql分区表概述、分区类型、分区管理

    另有一篇简单易懂的好文章帮助学习 Mysql分区表的原理和优缺点以及注意点 一.分区概述 分区是指根据一定的规则,数据库把一个表分解成多个更小的.更容易管理的部分.分区有利于管理非常大的表. MySQ ...

  6. mysql表分区数量限制_详解MySQL分区表的局限和限制的代码实例

    本文对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的 原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站查阅. 禁止构建 分区表达式不支持以下几种构建: ...

  7. mysql表分区备份_ZRM 2.1:备份MySQL分区表

    ZRM 2.1:备份MySQL分区表 MySQL 5.1通常可供生产使用. MySQL 5.1的主要功能之一就是分区. 表分区可以帮助提高性能和可用性. 表可以根据范围(给定范围内的列值),列表(匹配 ...

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

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

  9. mysql分区表truncate分区数据_详解MySQL分区表

    前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...

最新文章

  1. 【Java基础】集合
  2. java接口测试入门
  3. 矩阵连乘问题(动态规划算法)
  4. iOS应用跳转qq指定联系人聊天
  5. pcap文件解析工具_【免费毕设】PHP网络数据包分析工具的设计与开发(源代码+论文)...
  6. 30 天精通 RxJS (01):认识 RxJS
  7. python安装教程-python安装教程 Pycharm安装详细教程
  8. UVA-11491 Erasing and Winning (单调队列)
  9. js文本框设置必填项_JS校验表单必填项
  10. Armbian安装Docker之后的100种玩儿法《动态域名解析DDNS自动更新》
  11. 12/14 计算器雏形
  12. LeetCode1619删除某些元素后的数组均值(java)
  13. JDBC防止SQL注入原理
  14. 如何把文本文档转换成html格式,把固定格式的文本文档转换为Excel电子表格的方法...
  15. Didn't find class XXX on path: DexPathList [zip file XXX]
  16. 环境监测系统/智能监测平台---Vue/Node.js
  17. 【多线程与高并发】JMM内存模型 基础
  18. C++ 什么是继承和派生
  19. python语言编程-Python成为2018年度编程语言,遥遥领先于其他语言
  20. 2004.8.19日--全国3D第2期

热门文章

  1. python提供的内置函数有哪些_python内置函数介绍
  2. JAVA提示定义常量_如何在Java中定义常量(Constant)
  3. mysql 字符串用省略号_CSS截取字符串自动补充省略号
  4. mysql 将select结果导出文件 linux
  5. 定时器开始时延时了十几秒_第六章--系统滴答定时器
  6. cli php 增强包_Linux 上安装 PHP 扩展
  7. ipad 计算机连接网络设置方法,iPad Air怎么设置上网?苹果平板常用的上网方法图解...
  8. 为什么用python的时候特别卡_【后端开发】python为什么会运行慢
  9. vscode 5500 but failed to open in Browser Preview. Got Browser Preview extension installed?
  10. java web ajax异步刷新页面,ajax自动刷新页面有关问题