db2有主键时默认hash分区_MySQL分区表最佳实践

前言:

分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用场景,有需要的朋友可以参考一下,希望对你有所帮助。

1.分区的目的及分区类型

MySQL在创建表的时候可以通过使用PARTITION BY子句定义每个分区存放的数据。在执行查询的时候,优化器根据分区定义过滤那些没有我们需要的数据的分区,这样查询就可以无需扫描所有分区,只需要查找包含需要数据的分区即可。

分区的另一个目的是将数据按照一个较粗的粒度分别存放在不同的表中。这样做可以将相关的数据存放在一起,另外,当我们想要一次批量删除整个分区的数据也会变得很方便。

下面简单介绍下四种常见的分区类型:

  • RANGE分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段。
  • LIST分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。
  • HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  • KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

上述四种分区类型中,RANGE分区即范围分区是最常用的。RANGE分区的特点是多个分区的范围要连续,但是不能重叠,默认情况下使用VALUES LESS THAN属性,即每个分区不包括指定的那个值。

2.分区操作示例

本节内容以RANGE分区为例,介绍下分区表相关的操作。

# 创建分区表mysql> CREATE TABLE `tr` (    ->   `id` INT,     ->   `name` VARCHAR(50),     ->   `purchased` DATE    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8    -> PARTITION BY RANGE( YEAR(purchased) ) (    -> PARTITION p0 VALUES LESS THAN (1990),    -> PARTITION p1 VALUES LESS THAN (1995),    -> PARTITION p2 VALUES LESS THAN (2000),    -> PARTITION p3 VALUES LESS THAN (2005),    -> PARTITION p4 VALUES LESS THAN (2010),    -> PARTITION p5 VALUES LESS THAN (2015)    -> );Query OK, 0 rows affected (0.28 sec)# 插入数据mysql> INSERT INTO `tr` VALUES    ->     (1, 'desk organiser', '2003-10-15'),    ->     (2, 'alarm clock', '1997-11-05'),    ->     (3, 'chair', '2009-03-10'),    ->     (4, 'bookcase', '1989-01-10'),    ->     (5, 'exercise bike', '2014-05-09'),    ->     (6, 'sofa', '1987-06-05'),    ->     (7, 'espresso maker', '2011-11-22'),    ->     (8, 'aquarium', '1992-08-04'),    ->     (9, 'study desk', '2006-09-16'),    ->     (10, 'lava lamp', '1998-12-25');Query OK, 10 rows affected (0.03 sec)Records: 10  Duplicates: 0  Warnings: 0

创建后可以看到,每个分区都会对应1个ibd文件。上面创建语句还是很好理解的,在此分区表中,通过YEAR函数取出DATE日期中的年份并转化为整型,年份小于1990的存储在分区p0中,小于1995的存储在分区p1中,以此类推。请注意,每个分区的定义顺序是从最低到最高。为了防止插入的数据因找不到相应分区而报错,我们应该及时创建新的分区。下面继续展示关于分区维护的其他操作。

# 查看某个分区的数据mysql> SELECT * FROM tr PARTITION (p2);+------+-------------+------------+| id   | name        | purchased  |+------+-------------+------------+|    2 | alarm clock | 1997-11-05 ||   10 | lava lamp   | 1998-12-25 |+------+-------------+------------+2 rows in set (0.00 sec)# 增加分区mysql> alter table tr add partition(    -> PARTITION p6 VALUES LESS THAN (2020)    -> );Query OK, 0 rows affected (0.06 sec)Records: 0  Duplicates: 0  Warnings: 0# 拆分分区mysql> alter table tr reorganize partition p5 into(    ->   partition s0 values less than(2012),    ->   partition s1 values less than(2015)    -> );Query OK, 0 rows affected (0.26 sec)Records: 0  Duplicates: 0  Warnings: 0# 合并分区mysql> alter table tr reorganize partition s0,s1 into (     ->     partition p5 values less than (2015)     -> );Query OK, 0 rows affected (0.12 sec)Records: 0  Duplicates: 0  Warnings: 0# 清空某分区的数据mysql> alter table tr truncate partition p0;Query OK, 0 rows affected (0.11 sec)# 删除分区mysql> alter table tr drop partition p1;Query OK, 0 rows affected (0.06 sec)Records: 0  Duplicates: 0  Warnings: 0# 交换分区# 先创建与分区表同样结构的交换表mysql> CREATE TABLE `tr_archive` (    ->   `id` INT,     ->   `name` VARCHAR(50),     ->   `purchased` DATE    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;Query OK, 0 rows affected (0.28 sec)# 执行exchange交换分区 mysql> alter table tr exchange PARTITION p2 with table tr_archive;Query OK, 0 rows affected (0.13 sec)    

3.分区注意事项及适用场景

其实分区表的使用有很多限制和需要注意的事项,参考官方文档,简要总结几点如下:

  • 分区字段必须是整数类型或解析为整数的表达式。
  • 分区字段建议设置为NOT NULL,若某行数据分区字段为null,在RANGE分区中,该行数据会划分到最小的分区里。
  • MySQL分区中如果存在主键或唯一键,则分区列必须包含在其中。
  • Innodb分区表不支持外键。
  • 更改sql_mode模式可能影响分区表的表现。
  • 分区表不影响自增列。

从上面的介绍中可以看出,分区表适用于一些日志记录表。这类表的特点是数据量大、并且有冷热数据区分,可以按照时间维度来进行数据归档。这类表是比较适合使用分区表的,因为分区表可以对单独的分区进行维护,对于数据归档更方便。

4.分区表为什么不常用

在我们项目开发中,分区表其实是很少用的,下面简单说明下几点原因:

  • 分区字段的选择有限制。
  • 若查询不走分区键,则可能会扫描所有分区,效率不会提升。
  • 若数据分布不均,分区大小差别较大,可能性能提升也有限。
  • 普通表改造成分区表比较繁琐。
  • 需要持续对分区进行维护,比如到了6月份前就要新增6月份的分区。
  • 增加学习成本,存在未知风险。

总结:

本文较为详细的介绍了MySQL分区相关内容,如果想使用分区表的话,建议提早做好规划,在初始化的时候即创建分区表并制定维护计划,使用得当还是比较方便的,特别是有历史数据归档需求的表,使用分区表会使归档更方便。当然,关于分区表的内容还有很多,有兴趣的同学可以找找官方文档,官方文档中有大量示例。

参考:

  • https://dev.mysql.com/doc/refman/5.7/en/partitioning.html
  • https://www.jianshu.com/p/b61d767f4ff5
95518367b3c54863a1337747945b909e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员过关斩将-- 喷一喷坑爹的面向UI编程

点击上方“蓝字”关注我们菜菜哥,求你个事呗?说来听听,假装你男朋友可不干不是哦,是正经事。前几天一个项目UI改了,好多人跟着加班修改,怎么样尽量避免这种情况呢?UI修改顶多和客户端开发人员关…

python二维散点分布图_深入理解皮尔逊相关系数amp;python代码

1.常见理解误区(1)计算出变量A和变量B的皮尔逊相关系数为0,不代表A和B之间没有相关性,只能说明A和B之间不存在线性相关关系。例:温度和冰淇淋销量之间的散点图像如下,可以发现大致成二次函数图像&#xff0…

hdu4911 Inversion-归并排序

解题思路: 如果原序列的逆序对数大于交换次数,那么最少的逆序对数量就是原序列逆序对-交换次数。 如果原序列的逆序对数小于等于交换次数,那么最少的逆序对数量为0,因为交换次数超过逆序对数,可以把这些逆序对全部消除…

【.net core】电商平台升级之微服务架构应用实战

一、前言这篇文章本来是继续分享IdentityServer4 的相关文章,由于之前有博友问我关于微服务相关的问题,我就先跳过IdentityServer4的分享,进行微服务相关的技术学习和分享。微服务在我的分享目录里面是放到四月份开始系列文章分享的&#xff…

c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...

「今天是学习C语言第 148 天」纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」# 静态链表使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系。实现要点:1.数组下标为0的位置为头结点,指…

集成平台集群任务动态分派

源宝导读:MIP集成平台是为了解决企业大量异构系统之间快速、稳定集成的需要,助力企业数字化转型,明源云自主研发的平台系统。本文将对"事件任务分派"场景的架构设计以及实践成果进行分享。背景MIP集成平台是为了解决企业大量异构系…

dotcpp1115 DNA-打印图案

题目描述 小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词–DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧 输入 输…

akb48_AKB48里历史——六年的终结

注:这是2012年发行的一本在BUBUKA连载的基础上补充了一些内容的粉丝公式教科书,从里面找了部分内容翻译了一下,节选的内容主要说的是2011年的事情,以当时作者的视角,是AKB48第一次新老粉丝换代的时期。前田敦子和大岛优…

[头脑风暴] 解读Docker Bridge网络模型

背景这几天在研究Kubernetes, 遇到一个有意思的nodejs镜像:luksa/kubia# 不带端口映射启动容器 docker run -it -d luksa/kubia # 连接到默认的Bridge网桥,容器IP是 172.17.0.2之后,在宿主机使用容器IP和8080 端口可访问该容器…

kodi pvr 不能安装_「家庭影音串流」电视最强播放器KODI使用方法

本文作者:空翻的帕兹文章适用电脑手机等全平台设备,在用户没有nas的情况下如何使用串流电视最强播放器KODIKodi是由XBMC基金會開發的開源媒體播放器,原名XBMC(最後一個以XBMC命名的版本是13.2「Gotham」,14.0 「Helix」是第一個以…

docker部署flask项目

项目本地运行 1.到github或者自己创建一个flask项目,确保在本地是可以运行成功的 2.上传到自己的代码仓库 服务器部署 1.安装docker yum install docker -y2.配置加速器 DaoCloud加速器采用自主研发的智能路由及缓存技术,并引入了现金的协议层优化…

.NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记...

24 | 文件提供程序:让你可以将文件放在任何地方文件提供程序核心类型:1、IFileProvider2、IFileInfo3、IDirectoryContentsIFileProvider 是访问各种各样文件提供程序的接口通过这样子抽象的定义,让我们与具体的抽象文件的读取的代码进行了隔…

连接mysql数据库_解决Navicat连接MySQL数据库报错问题

今天在用Navicat连接另外一台主机上的MySQL时报错:Host is not allowed to connect to this MySQL server默认安装的mysql无法远程连接是因为MySQL默认配置了不支持远程连接引起的。解决方法:一、本地主机上登录root用户找到mysql.exe所在路径&#xff0…

洛谷T172098 子串-substr

代码如下&#xff1a; #include <iostream> #include <cstring> using namespace std;int main() {int cnt;cin >> cnt;string a, b;while (cnt--) {int n, m;cin >> n >> m;cin >> a;cin >> b;int ans 0 ;for (int i 0; i < …

在Ocelot中使用自定义的中间件(二)

在上文中《在Ocelot中使用自定义的中间件&#xff08;一&#xff09;》&#xff0c;我介绍了如何在Ocelot中使用自定义的中间件来修改下游服务的response body。今天&#xff0c;我们再扩展一下设计&#xff0c;让我们自己设计的中间件变得更为通用&#xff0c;使其能够应用在不…

机器学习理论引导 电子版_机器学习理论篇1:机器学习的数学基础(2)

本节主要就是讲述的机器学习的数学基础&#xff0c;提到数学基础&#xff0c;可能一眼就会是满眼的枯燥、没意思&#xff0c;但是成就英雄的路上注定了孤独&#xff0c;要想要真正的在学术上有所突破就必须挨得住寂寞&#xff0c;受得住孤独&#xff0c;才能真正的走进熟悉直到…

洛谷T172100 商店-贪心

解题思路&#xff1a; 贪心 代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std; const int N 100010; int a[N], w[N]; int ans;int main() {int n, m;cin >> n >> m;for (int i 1; i < n; i)cin >> a…

终结“永恒之蓝”后,再战“永恒之黑”

引子&#xff1a;2003年的“抗击非典”&#xff0c;17年后的2020年“抗击新冠”。2017年的“永恒之蓝”&#xff0c;3年后的2020年“永恒之黑”。历史&#xff1a;2017年5月13日&#xff0c;在“胖哥技术堂”中发布了《截杀“WannaCrypt”&#xff0c;终结“永恒之蓝”》。三年…

使用.Net Core编写命令行工具(CLI)

使用.Net Core编写命令行工具(CLI)命令行工具(CLI)命令行工具(CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面&#xff0c;它通常不支持鼠标&#xff0c;用户通过键盘输入指令&#xff0c;计算机接收到指令后&#xff0c;予以执行。通常认为&#xff0c;命令行工具(C…

与php有区别_php://output和php://stdout的区别

php中文网最新课程每日17点准时技术干货分享PHP包含了以php://开头的一系列输出输出流&#xff0c;如php://stdin, php://stdout等。今天查看代码时&#xff0c;忽然想到一个问题&#xff1a;php://output和php://stdout有什么区别&#xff1f;从PHP的官方文献中找答案&#xf…