(以下的排版我汗一个。。。 在编辑的时候显示是有段落的,保存后居然是这个样子的。。。)
分区的类型有 range,list,hash,key
1.range
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 RANGE (YEAR(separated)) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
range(exp) exp 计算结果必须在 values less than 的取值范围当中
less than 的取值必须由小到大
2.list
其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。
注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。
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 LIST(store_id)
PARTITION pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
删除某个分区的数据:
ALTER TABLE employees DROP PARTITION pWest;
3.hash
HASH分区主要用来确保数据在预先确定数目的分区中平均分布
PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式
PARTITIONS num”子句,其中num 是一个非负的整数,它表示表将要被分割成分区的数量。
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;
*最有效率的哈希函数是只对单个表列进行计算,并且它的值随列值进行一致地增大或减小,也就是说,表达式值和它所基于的列的值变化越接近,MySQL就可以越有效地使用该表达式来进行HASH分区。
换句话说,如果列值与表达式值之比的曲线图越接近由等式“y=nx(其中n为非零的常数)描绘出的直线,则该表达式越适合于 哈希
3.1 LINEAR HASH
1.) 找到下一个大于num.的、2的幂,我们把这个值称为V ,它可以通过下面的公式得到:
2.) V = POWER(2, CEILING(LOG(2, num)))
(例如,假定num是13。那么LOG(2,13)就是3.7004397181411。 CEILING(3.7004397181411)就是4,则V = POWER(2,4), 即等于16)。
3.) 设置 N = F(column_list) & (V - 1).
4.) 当 N >= num:
设置 V = CEIL(V / 2)
设置 N = N & (V - 1)
按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(1000吉)数据的表。它的缺点在于,与使用常规HASH分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。
4.key
按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供
“CREATE TABLE ... PARTITION BY KEY”的语法规则类似于创建一个通过HASH分区的表的规则。它们唯一的区别在于使用的关键字是KEY而不是HASH,并且KEY分区只采用一个或多个列名的一个列表。
通过线性KEY分割一个表也是可能的。下面是一个简单的例子:
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
二。
子分区: 子分区结合 range,list 与 hash,key 分区
CREATE TABLE ts (id INT, purchased DATE)
PARTITION BY RANGE(YEAR(purchased))
SUBPARTITION BY HASH(TO_DAYS(purchased))
SUBPARTITIONS 2
(
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
表ts 有3个RANGE分区。这3个分区中的每一个分区——p0, p1, 和 p2 ——又被进一步分成了2个子分区。实际上,整个表被分成了3 * 2 = 6个分区
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
)
);
以上作用和上一个例子相同,但是要注意:
1.每个分区必须有相同数量的子分区。
2.每个SUBPARTITION 子句必须包括 (至少)子分区的一个名字
子分区可以用于特别大的表,在多个磁盘间分配数据和索引。假设有6个磁盘,分别为/disk0, /disk1, /disk2等。现在考虑下面的例子:
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
DATA DIRECTORY = '/disk0/data'
INDEX DIRECTORY = '/disk0/idx',
SUBPARTITION s1
DATA DIRECTORY = '/disk1/data'
INDEX DIRECTORY = '/disk1/idx'
),
PARTITION p1 VALUES LESS THAN (2000)
(
SUBPARTITION s0
DATA DIRECTORY = '/disk2/data'
INDEX DIRECTORY = '/disk2/idx',
SUBPARTITION s1
DATA DIRECTORY = '/disk3/data'
INDEX DIRECTORY = '/disk3/idx'
),
PARTITION p2 VALUES LESS THAN MAXVALUE
(
SUBPARTITION s0
DATA DIRECTORY = '/disk4/data'
INDEX DIRECTORY = '/disk4/idx',
SUBPARTITION s1
DATA DIRECTORY = '/disk5/data'
INDEX DIRECTORY = '/disk5/idx'
)
);
三、MySQL分区处理NULL值的方式
MySQL 中的分区在禁止空值(NULL)上没有进行处理,无论它是一个列值还是一个用户定义表达式的值。一般而言,在这种情况下MySQL 把NULL视为0。如果你希望回避这种做法,你应该在设计表时不允许空值;最可能的方法是,通过声明列“NOT NULL”来实现这一点。
四、分区管理语句
“REORGANIZE PARTITION”的基本语法是:
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO (partition_definitions);
拆分分区:(不丢失数据)
ALTER TABLE members REORGANIZE PARTITION p0 INTO (
PARTITION s0 VALUES LESS THAN (1960),
PARTITION s1 VALUES LESS THAN (1970)
);
合并分区:
ALTER TABLE members REORGANIZE PARTITION s0,s1 INTO (
PARTITION p0 VALUES LESS THAN (1970)
);
ALTER TABLE members REORGANIZE PARTITION p0,p1,p2,p3 INTO (
PARTITION m0 VALUES LESS THAN (1980),
PARTITION m1 VALUES LESS THAN (2000)
);
注意点:
1.新分区模式不能有任何重叠的区间(适用于按照RANGE分区的表)或值集合(适用于重新组织按照LIST分区的表)。
2.partition_definitions 列表中分区的合集应该与在partition_list 中命名分区的合集占有相同的区间或值集合。
3.对于按照RANGE分区的表,只能重新组织相邻的分区;不能跳过RANGE分区。
4.不能使用REORGANIZE PARTITION来改变表的分区类型
如果想在不删除和重建表的条件下实现这两个任务,可以使用“ALTER TABLE ... PARTITION BY ....”,例如:
· ALTER TABLE members
· PARTITION BY HASH(YEAR(dob))
· PARTITIONS 8;
分享到:
相关推荐
MySQL是世界上最受欢迎的关系型数据库管理...以上只是MySQL学习笔记的一部分内容,实际的学习过程中,你还会接触到触发器、分区、复制、集群等更高级的主题。不断实践和深入研究,才能真正掌握这个强大的数据库系统。
这份“超经典mysql dba学习笔记”包含了丰富的MySQL运维知识,对于想要深入理解和掌握MySQL DBA技能的人来说是一份宝贵的资料。 一、MySQL基础知识 在学习MySQL DBA之前,首先需要了解MySQL的基本概念,包括数据库...
这份“MySQL学习笔记”将引导我们深入理解其核心概念和实用技能。 一、MySQL简介 MySQL是一个开源、免费的数据库系统,由瑞典的MySQL AB公司开发,后被Oracle公司收购。它的设计目标是速度、可移植性和简洁性,支持...
MySQL 是一款广泛使用的开源关系型数据库管理系统,其学习笔记涵盖了多个关键知识点。以下是对这些知识点的详细解释: 1. **MySQL 体系架构** - **网络连接层**:处理客户端的连接请求,包括连接管理、认证和安全...
这份“Mysql详细学习笔记”显然是一个深入解析MySQL的资源,旨在帮助初学者和有经验的开发者更好地理解和运用SQL语句。以下是笔记中可能包含的一些核心知识点: 1. **SQL基础**:SQL(Structured Query Language)...
这份“MySQL工作学习笔记”压缩包文件可能是由一位经验丰富的数据库管理员或开发者整理,包含了关于MySQL的深入理解和实践技巧。尽管没有具体的标签来指导,但我们可以从“MySQL工作学习笔记”这个标题推测,内容...
### MySQL学习笔记知识点详解 #### 一、MySQL服务管理 **1. 启动MySQL服务** 在Windows环境中,可以通过以下命令启动MySQL服务: ```sql net start mysql ``` **2. 创建Windows服务** 若要手动创建一个...
本学习笔记旨在提供全面的MySQL语法知识,帮助读者从基础到进阶,掌握数据库管理和开发的基本技能。 首先,我们需要理解SQL(Structured Query Language),这是一种用于管理关系数据库的标准编程语言。SQL的主要...
这份"MySQL数据库学习笔记.zip"文件很可能包含了关于MySQL的基本概念、安装与配置、SQL语句、表的设计、索引、视图、存储过程、触发器、事务处理、备份与恢复等多方面的内容。下面我们将深入探讨这些关键知识点。 1...
【Linux下MySQL学习笔记】 MySQL是一款广泛应用于互联网的开源关系型数据库管理系统,尤其在Linux操作系统上,其稳定性和性能表现尤为突出。本笔记主要针对在Linux环境下安装、配置、管理和优化MySQL的过程进行详解...
以上只是MySQL学习笔记的一部分,实际的学习过程中还应包括更多的实践操作和进阶主题,如性能监控、备份恢复、InnoDB引擎特性和SQL高级特性等。对于Kwan1117这个文件名,可能是作者的个人标识或特定的学习章节,具体...
这篇入门学习笔记将带你深入了解MySQL的基础知识,以及如何进行性能优化。让我们逐一探讨这些主题。 首先,数据库概述:MySQL是一个开源、免费的数据库系统,基于SQL(结构化查询语言)标准,由Oracle公司维护。它...
MySQL 5.1是该系列的一个重要版本,引入了对事务处理的支持和分区表功能,这些特性显著提升了其在企业级应用中的性能和可靠性。 MySQL的基础知识包括以下几个方面: 1. **MySQL安装**:MySQL可以从官方网站...
以上内容仅是MySQL学习笔记的一部分,深入学习还需涵盖更多高级主题,如性能优化、备份与恢复、SQL性能分析等。在实际应用中,理解这些概念并熟练运用,能够帮助开发者构建高效、可靠的数据库解决方案。
这份“超经典MySQL DBA培训笔记”显然涵盖了MySQL数据库管理的各个方面,是DBA或者对MySQL有兴趣的学习者的重要参考资料。接下来,我将根据这个主题,详细解释MySQL DBA需要掌握的关键知识点。 1. **MySQL基础知识*...
这篇鲁班学院的MySQL底层原理分析学习笔记将深入探讨MySQL的核心机制,帮助读者理解数据存储、查询优化、事务处理以及并发控制等关键概念。 1. **存储引擎**:MySQL支持多种存储引擎,如InnoDB(事务安全,支持行级...
尚硅谷的MySQL笔记可能是为了帮助学习者深入理解和掌握MySQL的相关知识而编写的。这份笔记可能包含了从基础概念到高级特性的全面讲解,包括但不限于SQL语言、数据类型、数据库设计、索引、事务处理、视图、存储过程...
通过阅读《高性能MySQL》的学习笔记,读者不仅可以深入了解MySQL的内部工作原理,还能掌握实践中的优化技巧,从而提升数据库的运行效率和系统的整体性能。无论是开发人员还是DBA,这本书都是不可多得的参考资料。
这份“mysql的学习笔记”涵盖了MySQL的核心概念、所涉及的技术以及如何实现它们。让我们深入探讨一下这些关键点。 **核心概念** 1. **关系型数据库**: MySQL基于关系型数据库模型,其中数据以表格形式存储,每个...
本篇学习笔记涵盖了从基础操作到高级特性的全面内容,旨在帮助读者从初级到高级提升MySQL技能,成为一名数据库管理员。 首先,我们从MySQL的启动和管理开始。在Windows环境下,可以使用`net start mysql`命令来启动...