MySQL 分区表

MySQL 分区表

今天统计数据的时候发现一张表使用了表分区,借此机会记录一下。

1. 什么是表分区?

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

2. 表分区与分表的区别

分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。

3. 表分区有什么好处?

1)分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。 2)和单个磁盘或者文件系统相比,可以存储更多数据 3)优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。 4)分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。 5)可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。

4. 分区表的限制因素

1)一个表最多只能有1024个分区 2) MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。 3)如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。 4)分区表中无法使用外键约束 5)MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。

5. 如何判断当前MySQL是否支持分区?

命令:show variables like '%partition%' 运行结果:

mysql> show variables like '%partition%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ 1 row in set (0.00 sec) 

have_partintioning 的值为YES,表示支持分区。

6. MySQL支持的分区类型有哪些?

1)RANGE分区:按照数据的区间范围分区 2)LIST分区:按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。 3)HASH分区 4)KEY分区 说明 在MySQL5.1版本中,RANGE,LIST,HASH分区要求分区键必须是INT类型,或者通过表达式返回INT类型。但KEY分区的时候,可以使用其他类型的列(BLOB,TEXT类型除外)作为分区键。

7. Range分区

利用取值范围进行分区,区间要连续并且不能互相重叠。 语法:

partition by range(exp)( //exp可以为列名或者表达式,比如to_date(created_date) partition p0 values less than(num) ) 

例如:

mysql> create table emp(
    -> id INT NOT null, -> store_id int not null -> ) -> partition by range(store_id)( -> partition p0 values less than(10), -> partition p1 values less than(20) -> );

上面的语句创建了emp表,并根据store_id字段进行分区,小于10的值存在分区p0中,大于等于10,小于20的值存在分区p1中。 注意 每个分区都是按顺序定义的,从最低到最高。上面的语句,如果将less than(10) 和less than (20)的顺序颠倒过来,那么将报错,如下:

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

RANGE分区存在的问题

  1. range范围覆盖问题:当插入的记录中对应的分区键的值不在分区定义的范围中的时候,插入语句会失败。 上面的例子,如果我插入一条store_id = 30的记录会怎么样呢? 我们上面分区的时候,最大值是20,如果插入一条超过20的记录,会报错:
    mysql> insert into emp(id,store_id) values(2,30); ERROR 1526 (HY000): Table has no partition for value 30 

    提示30这个值没有对应的分区。 解决办法 A. 预估分区键的值,及时新增分区。 B. 设置分区的时候,使用values less than maxvalue 子句,MAXVALUE表示最大的可能的整数值。 C. 尽量选择能够全部覆盖的字段作为分区键,比如一年的十二个月等。

  2. Range分区中,分区键的值如果是NULL,将被作为一个最小值来处理。

8. LIST分区

List分区是建立离散的值列表告诉数据库特定的值属于哪个分区。 语法:

    partition by list(exp)( //exp为列名或者表达式 http://www.cnblogs.com/roucheng/ partition p0 values in (3,5) //值为3和5的在p0分区 ) 

与Range不同的是,list分区不必生命任何特定的顺序。例如:

mysql> create table emp1(
    -> id int not null, -> store_id int not null -> ) -> partition by list(store_id)( -> partition p0 values in (3,5), -> partition p1 values in (2,6,7,9) -> );

注意 如果插入的记录对应的分区键的值不在list分区指定的值中,将会插入失败。并且,list不能像range分区那样提供maxvalue。

9. Columns分区

MySQL5.5中引入的分区类型,解决了5.5版本之前range分区和list分区只支持整数分区的问题。 Columns分区可以细分为 range columns分区和 list columns分区,他们都支持整数,日期时间,字符串三大数据类型。(不支持text和blob类型作为分区键) columns分区还支持多列分区(这里不详细展开)。

10. Hash分区

Hash分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。 MySQL支持两种Hash分区:常规Hash分区和线性Hash分区。 A. 常规Hash分区:使用取模算法 语法:

partition by hash(store_id) partitions 4; 

上面的语句,根据store_id对4取模,决定记录存储位置。 比如store_id = 234的记录,MOD(234,4)=2,所以会被存储在第二个分区。

常规Hash分区的优点和不足 优点:能够使数据尽可能的均匀分布。 缺点:不适合分区经常变动的需求。假如我要新增加两个分区,现在有6个分区,那么MOD(234,6)的结果与之前MOD(234,4)的结果就会出现不一致,这样大部分数据就需要重新计算分区。为解决此问题,MySQL提供了线性Hash分区。

B. 线性Hash分区:分区函数是一个线性的2的幂的运算法则。 语法:

partition by LINER hash(store_id) partitions 4; 

与常规Hash的不同在于,“Liner”关键字。 算法介绍: 假设要保存记录的分区编号为N,num为一个非负整数,表示分割成的分区的数量,那么N可以通过以下步骤得到: Step 1. 找到一个大于等于num的2的幂,这个值为V,V可以通过下面公式得到: V = Power(2,Ceiling(Log(2,num))) 例如:刚才设置了4个分区,num=4,Log(2,4)=2,Ceiling(2)=2,power(2,2)=4,即V=4 Step 2. 设置N=F(column_list)&(V-1) 例如:刚才V=4,store_id=234对应的N值,N = 234&(4-1) =2 Step 3. 当N>=num,设置V=Ceiling(V/2),N=N&(V-1) 例如:store_id=234,N=2<4,所以N就取值2,即可。 假设上面算出来的N=5,那么V=Ceiling(2.5)=3,N=234&(3-1)=1,即在第一个分区。

线性Hash的优点和不足 优点:在分区维护(增加,删除,合并,拆分分区)时,MySQL能够处理得更加迅速。 缺点:与常规Hash分区相比,线性Hash各个分区之间的数据分布不太均衡。

11. Key分区

类似Hash分区,Hash分区允许使用用户自定义的表达式,但Key分区不允许使用用户自定义的表达式。Hash仅支持整数分区,而Key分区支持除了Blob和text的其他类型的列作为分区键。 语法:

partition by key(exp) partitions 4;//exp是零个或多个字段名的列表 hovertree.com 

key分区的时候,exp可以为空,如果为空,则默认使用主键作为分区键,没有主键的时候,会选择非空惟一键作为分区键。

12. 子分区

分区表中对每个分区再次分割,又成为复合分区。

 

总结一下本文:

1. 什么是表分区?
2. 表分区与分表的区别
3. 表分区有什么好处?
4. 分区表的限制因素
5. 如何判断当前MySQL是否支持分区?
6. MySQL支持的分区类型有哪些?
7. Range分区
8. LIST分区
9. Columns分区
10. Hash分区
11. Key分区
12. 子分区

http://www.cnblogs.com/roucheng/p/nodecookie.html

转载于:https://www.cnblogs.com/roucheng/p/mysqlfenqu.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109198.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大疆网上测评题库_大疆科技题目

    大疆网上测评题库_大疆科技题目Const:1、定义常量(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。TYPEconstValueName=value;constTYPEValueName=value;(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进…

    2022年6月16日
    56
  • 万字图解Java多线程

    万字图解Java多线程前言java多线程我个人觉得是javaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,本篇文章将使用实例+图解+源码的方式来解析java多线程。文章篇幅较长,大家也可以有选择的看具体章节,建议多线程的代码全部手敲,永远不要相信你看到的结论,自己编码后运行出来的,才是自己的。什么是java多线程?进程与线程进程当一个程序被运行,就开启了一个进程,比如启动了qq,w.

    2022年6月6日
    32
  • pycharn 激活码【2022最新】

    (pycharn 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsa…

    2022年3月13日
    599
  • rpm包怎么打开(ubuntu rpm格式)

    WPSOffice2019ForLinux发布11.1.0.9505版本了,在2020年4月9日提供了wps-office_11.1.0.9505_amd64.deb/rpm下载,支持X64、MIPS、ARM计算机架构。使用旧版本的用户可升级到新版本。WPSOffice2019ForLinux11.1.0.9505版更新内容1、WPS公共:支持金山会议,云上开会,协作无间。支持自…

    2022年4月11日
    68
  • 如何安装Java?

    如何安装Java?在本文中,我们将研究如何安装Java,在Windows操作系统中安装Java,如何检查已安装的版本以及设置环境变量。因此,让我们开始吧。如何安装Java?Java支持许多平台,例如Windows,Linux,Solaris等。这些平台具有自己的安装方法。在本教程中,我们将介绍32位和64位OS的安装过程Windows操作系统。Windows操作系统中的Java安装在Windows操作系统中,32位和64位Windows操作系统都具有类似的Java安装方式。主要区别在于它们的安装软件包。如何检查主机

    2022年7月9日
    20
  • matlab如何读取路径下所有图片_matlab保存到指定文件夹

    matlab如何读取路径下所有图片_matlab保存到指定文件夹之前的matlab学习中接触了各种图片的处理方式和算法函数,现在考虑的是如何保存和输出图片matlab中的图片保存方式imwrite函数imwrite函数是和imread函数配套的图片读取输出函数,写法和imread函数一样imwrite(I,‘lena.jpg’)需要注意的是在保存之前需要保存一个句柄I=getimage(gcf)但是问题在于imwrite函数保存的图片是已经定义过的图片在以下代…

    2022年9月12日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号