RANGE分区通过使用PARTITION BY RANGE(expr)实现 , 其中“expr” 可以是某个列值 , 或一个基于某个列值并返回一个整数值的表达式 , 如YEAR(date) 。
不过值得注意的是 , expr的返回值 , 不可以为NULL 。
VALUES LESS THAN的排列必须从小到大顺序列出 , 这样MySQL才能识别一个一个的区间段 。
涉及聚合函数SUM()、COUNT()的查询时 , 如果不指定分区 , 那么会在每个分区上并行处理 。
LIST分区MySQL中的LIST分区在很多方面类似于RANGE分区 。
和RANGE分区一样 , LIST分区的每个分区必须明确定义 。
它们的主要区别在于 , LIST分区是基于枚举出的值列表分区 , RANGE是基于给定连续区间范围分区;
LIST分区通过使用PARTITION BY LIST(expr)来实现。
例如:
create table user(a int(11),b int(11))partition by list(b)(partition p0 values in (1,3,5,7,9),partition p1 values in (2,4,6,8,0));
如果试图插入字段值(或分区表达式的返回值)不在分区值列表中的任何一行时 , 那么“INSERT”查询将失败并报错 。
要重点注意的是 , LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义 。所以将要匹配的任何值都必须在值列表中能够找到 。
HASH分区HASH分区主要用来确保数据在预先确定数目的分区中平均分布 。
在RANGE和LIST分区中 , 我们必须明确指定一个给定的区间或列值集合 , 来指定哪些记录进入哪些分区;
而在HASH分区中 , MySQL自动完成分配记录到区间的工作 , 你所要做的只是确定一个用来做哈希的字段或者表达式 , 以及指定被分区的表将要被分割成的分区数量 。
PARTITION BY HASH
例如:
CREATE TABLE employees (id INT NOT NULL,fname VARCHAR(30),lname VARCHAR(30),hired DATE NOT NULL DEFAULT '1970-01-01',separated DATE NOT NULL DEFAULT '9999-12-31',job_code INT,store_id INT)PARTITION BY HASH(store_id)PARTITIONS 4;
如果没有包括一个PARTITIONS子句 , 那么分区的数量将默认为1 。
最有效率的哈希函数是只对单个表列进行计算 , 并且它的结果值随字段值进行一致地增大或减小 , 因为这考虑了在分区范围上的“修剪” 。
也就是说 , 表达式值和它所基于的列的值变化越接近 , MySQL就可以越有效地使用该表达式来进行HASH分区 。
当使用了“PARTITION BY HASH”时 , MySQL将基于用户提供的函数结果的模数来确定使用哪个编号的分区 。换句话 , 对于一个表达式“expr” , 将要保存记录的分区编号为N , 其中“N = MOD(expr, num)” 。
KEY分区按照KEY进行分区类似于按照HASH分区 , 除了HASH分区使用的用户定义的表达式 , 而KEY分区的哈希函数是由MySQL 服务器提供 。
MySQLCluster使用函数MD5()来实现KEY分区;对于使用其他存储引擎的表 , 服务器使用其自己内部的 哈希函数 , 这些函数是基于与PASSword()一样的运算法则 。
“CREATE TABLE ... PARTITION BY KEY”的语法规则类似于创建一个通过HASH分区的表的规则 。它们唯一的区别在于使用的关键字是KEY而不是HASH , 并且KEY分区只采用一个或多个列名的一个列表 。
create table user(a int(11),b datetime)partition by key(b)partitions 4;
子分区子分区是分区表中每个分区的再次分割 。
例如:
CREATE TABLE ts (id INT, purchased DATE)PARTITION BY RANGE(YEAR(purchased))SUBPARTITION BY HASH(TO_DAYS(purchased))(PARTITION p0 VALUES LESS THAN (1990)(SUBPARTITION s0,SUBPARTITION s1),PARTITION p1 VALUES LESS THAN (2000)(SUBPARTITION s2,SUBPARTITION s3),PARTITION p2 VALUES LESS THAN MAXVALUE(SUBPARTITION s4,SUBPARTITION s5));
注意的语法项:
- 每个分区必须有相同数量的子分区 。
- 如果在一个分区表上的某个分区上使用SUBPARTITION来明确定义子分区 , 那么就必须定义其他所有分区的子分区 。
然后就可以根据具体的情况来持久化:
CREATE TABLE ts (id INT, purchased DATE)PARTITION BY RANGE(YEAR(purchased))SUBPARTITION BY HASH(TO_DAYS(purchased))(PARTITION p0 VALUES LESS THAN (1990)(SUBPARTITION s0aDATA DIRECTORY = '/disk0'INDEX DIRECTORY = '/disk1',SUBPARTITION s0bDATA DIRECTORY = '/disk2'INDEX DIRECTORY = '/disk3'),PARTITION p1 VALUES LESS THAN (2000)(SUBPARTITION s1aDATA DIRECTORY = '/disk4/data'INDEX DIRECTORY = '/disk4/idx',SUBPARTITION s1bDATA DIRECTORY = '/disk5/data'INDEX DIRECTORY = '/disk5/idx'),PARTITION p2 VALUES LESS THAN MAXVALUE(SUBPARTITION s2a,SUBPARTITION s2b));
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Brython:浏览器中的Python
- 知乎|跟进微博、抖音!知乎宣布全面上线显示用户IP属地
- MySQL的监控原理
- Java开发中的POJO、Dto、PO、Vo傻傻分不清楚?一文看懂
- SQL注入笔记记录+MySQL的事务隔离级别
- 荣耀|荣耀畅玩30入网:2.2GHz 5G芯片、4900mAh大电池
- 一些小故事大道理?小故事大、道理
- 打跑得快技巧十句口诀是什么?
- 读 MySQL 源码再看 INSERT 加锁流程
- MySQL 大批量插入,如何过滤掉重复数据?