Mysql之表分区

什么是表分区

通俗地讲表分区是将一个大表,根据条件分割成若干个小表。
mysql5.1开始支持数据表分区。如:某用户表的记录超过了600万条仓储信息,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。

为什么要做表分区

  为了改善大型表以及具有各种访问模式的表可伸缩性客观理性,和提高数据库效率

表分区有哪些优点
  1. 与单个磁盘或文件系统分区相比,可以存储更多的数据
  2. 通过删除与增加那些数据相关的分区,可以很容易的删除或增加那些数据
  3. 一些查询可以得到很好的优化
  4. 通过跨多个磁盘甚至服务器来分散数据查询来获得更大的查询吞吐量

基本分区类型

  1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区
  2. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  3. HASH分区∶基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  4. key分区:类似于hash分区,区别在于key分区只支持计算一列或多列。
range分区

给定一个连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。

ALTER TABLE 表名(或者在建表语句之后插入一下语句)
partition by range (字段)
partition 分区名 values less than (字段值),//小于但不等于该字段值
partition 分区名values less than (字段值),
partition 分区名values less than (MAXVALUE)

ALTER TABLE titles
partition by range (year(from_date))
partition po1 values less than (1985),
partition po2 values less than (1986),
partition po3 values less than (1987),
partition po4 values less than (1988),
partition p05 values less than (1999),
partition p06 values less than (MAXVALUE)
  • 以上的sql语句实现了将titles表按照year列的年份进行分区
list分区

 📜类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中"expr"是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过过号分隔的整数列表。

 🍕举个栗子:
 对于一个综合性的网店来说,商品分为诸多种类。我们可以按照商品D进行range分区,也可以按照商品的类型划分分区。在这个例子中,LIST分区给了我们更多的选择。

create table t2 (id int,cid int,name varchar(20),pos_datedatetime)
partition by list (cid)(
partition po1 values in (1,2,3),
partition po2 values in (4,5,6),
partition po3 values in (7,8,9))
  • 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  •  使用HASH分区的优点在于数据分布较为均匀。
create table t3 (id int,cid int,name varchar(20),pos_date datetime)
partition by hash (cid)
partitions 4;
LINEAR HASH分区
  • 线性与常规哈希的区别在于,线性哈希功能使用的一个线性的2的幂( powers-of-two)运算法则,而常规哈希使用的是求哈希函数值的模数。
  • 按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(1T)数据的表,
  • MySQL的线性哈希算法导致相比较常规哈希,数据可能分布的不那么均衡,容易产生"hotspot nodes"(有的分区数据多,有的分区数据少)。
  • 线性哈希分区和常规哈希分区在语法上的唯一区别在于,在"PARTITION BY"子句中添加“LINEAR”关键字。
create table t4 (id int,cid int,name varchar(20),pos_date datetime)
partition by linear hash(cid)
partitions 4;
KEY分区
  • 按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的哈希函数是由MySQL服务器提供。MySQL簇(Cluster)使用函数MD5(来实现KEY分区;对于使用其他存储引擎的表,服务器使用其自己内部的哈希函数,这些函数是基于与PASSWORD()—样的运算法则。
create table t4 (id int,cid int,name varchar(20),pos_date datetime)
partition by linear key(cid)
partitions 4;
多列分区

COLUMNS关键字允许字符串和日期列作为分区定义列,同时还允许使用多个列定义一个分区。

CREATE TABLE t6 ( a INT, b INT, c INT ) 
PARTITION BY RANGE COLUMNS ( a, b )(
PARTITION po1 VALUES less than ( 10, 10 ),//a小于10并且b小于10的分区,后面以此类推
PARTITION po2 VALUES less than ( 10, 20 ),
PARTITION po3 VALUES less than ( 10, 30 ),
PARTITION po4 VALUES less than ( 10, MAXVALUE ),
PARTITION po5 VALUES less than ( MAXVALUE, MAXVALUE ) );
多列分区案例

第一个分区用来存储雇佣于1990年以前的女职员,第二个分区存储股用于1990-2000年之间的女职员,第三个分区存储所有剩下的女职员。对于分区p04到p06,我们策略是一样的,只不过存储的是男职员。最后一个分区是控制情况。

create table employees ( emp_no int,birth_date date, first_name varchar(20),last_name varchar(20),gender char(1),hire_date date)engine=myisam
partition by range columns(gender,hire__date)( 
partition po1 values less than('F' ,'1990-01-01'), 
partition po2 values less than('F','2000-01-01'),
partition po3 values less than ('F',maxvalue),
partition po4 values less than ('M', '1990-01-01'),
partition po5 values less than ('M' ,'2000-01-O1'),
partition po6 values less than ('M',maxvalue),
partition p07 values less than (maxvalue,maxvalue));
子分区
  • 子分区是分区表中每个分区的再次分割。
  • 子分区可以用于特别大的表,在多个磁盘间分配数据和索引。该表t5分成了6个分区
CREATE TABLE t5 (id int,udate DATE)
PARTITION BY RANGE(YEAR(udate))//根据date字段的年份进行分区
SUBPARTITION BY HASH(TO_DAYS(udate))//根据date字段的日期对分区后的表再进行分区
SUBPARTITIONS 2(
PARTITION po VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE);

语法规则:

1、每个分区必须有相等的子分区
2、如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值