mysql分区表怎么看 mysql查看表分区数的命令( 三 )


解读:以上为uuid 等于1/2/3/5时放到p0分区 , 7/9/10放到p1分区,11/15放到p2分区 。当时用insert into时 如果uuid的值不存在p0/p1/p2分区时,则会插入失败而报错 。
3. HASH分区:
HASH分区主要用来确保数据在预先确定数目的分区中平均分布 。在RANGE分区和LIST分区中必须明确指定一个指定的列值或列值集合以指定应该保存在哪个分区中 。而在HASH分区中,MySQL会自动完成这些工作,要做的只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割成的分区数量 , 如:
CREATE TABLE tbl_test (
uuid INT NOT NULL,
title VARCHAR(20)
))
PARTITION BY HASH (uuid) (
PARTITIONS 3
));
解读:MySQL自动创建3个分区,在执行insert into时,根据插入的uuid通过算法来自动分配区间 。
注意:
(1) 由于每次插入、更新、删除一行 , 这个表达式都要计算一次,这意味着非常复杂的表达式可能会引起性能问题 , 尤其是在执行同时影响大量行的运算(例如批量插入)的时候 。
(2) 最有效率的哈希函数是只对单个表列进行计算,并且它的值随列值进行一致的增大或减小,因为这考虑mysql分区表怎么看了在分区范围上的“修剪” 。也就是说 , 表达式值和它所基于的列的值变化越接近,就越能有效地使用该表达式来进行HASH分区 。
3.1:线性HASH分区
线性HASH分区在“PARTITION BY”子句中添加“LINEAR”关键字 。
线性HASH分区的有点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有及其大量数据的表 。它的缺点在于各个分区间数据的分布不大可能均衡 。
4. KEY分区
类似于HASH分区,HASH分区允许用户自定义的表达式,而KEY分区则不允许使用用户自定义的表达式;HASH分区只支持整数分区,KEY分区支持除了blob和text类型之外的其他数据类型分区 。
与HASH分区不同,创建KEY分区表的时候,可以不指定分区键,默认会选择使用主键或唯一键作为分区键,没有主键或唯一键,就必须指定分区键 。
CREATE TABLE tbl_test (
uuid INT NOT NULL,
title VARCHAR(20)
))
PARTITION BY LINEAR Key (uuid)
PARTITIONS 3;
解读:根据分区键来进行分区
5. 子分区
子分区是分区表中 , 每个分区的再次分割,适合保存非常大量的数据 。
CREATE TABLE tbl_test (
registerTime Date
))
PARTITION BY GANGE(YEAR(registerTime))
SUBPARTITION BY HASH (TO_DAYS(registerTime))
SUBPARTITIONS 2
(
PARTITION p0 VALUES LESS THAN (2017),
PARTITION p1 VALUES LESS THAN (2020),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
解读:主分区使用RANGE按照年来进行分区,有3个RANGE分区 。这3个分区中又被进一步分成了2个子分区 , 实际上 , 整个表被分成了3 * 2 = 6个分区 。每个子分区按照天进行HASH分区 。小于2017的放在一起,2017-2020的放在一起 , 大于2020的放在一起 。
注意:
(1) 在MySQL5.1中,对于已经通过RANGE或LIST分区了的表在进行子分区是可能的 。子分区既可以使用HASH分区,也可以使用KEY分区 。这也被称为复合分区 。
(2) 每个分区必须有相同数量的子分区 。
(3) 如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区 , 那么就必须定义所有的子分区 。
(4) 每个SUBPARTITION子句必须包含(至少)子分区的一个名字 。
(5) 在每个子分区内 , 子分区的名字必须是惟一的 , 目前在整个表中,也要保持唯一 。例如:

推荐阅读