在MySQL
中,支持对表创建分区,主要的分区类型有Range
分区、List
分区、Hash
分区、Key
分区和子分区。
最近在项目中使用到Range
分区,将数据表进行了分区;Range
分区基于属于一个给定连续区间的列值,把多行分配给分区。每个分区包含那些分区表达式的值位于一个给定的连续区间内的行。这些区间要连续且不能相互重叠,使用VALUES LESS THAN
操作符来进行定义。在下面的几个例子中,假定你创建了一个如下的一个表,该表保存有20
家音像店的职员记录,这20
家音像店的编号从1
到20
:
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 NOT NULL,
store_id INT NOT NULL
);
根据你的需要,这个表可以有多种方式来按照区间进行分区。一种方式是使用store_id
列。例如,你可能决定通过添加一个PARTITION BY RANGE
子句把这个表分割成4
个区间,如下所示:
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 NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
按照这种分区方案,在商店1
到5
工作的雇员相对应的所有行被保存在分区P0
中,商店6
到10
的雇员保存在P1
中,依次类推。注意,每个分区都是按顺序进行定义,从最低到最高。这是PARTITION BY RANGE
语法的要求;在这点上,它类似于C
或Java
中的“switch ... case
”语句。
对于包含数据(72, 'Michael',
'Widenius', '1998-06-25', NULL, 13)
的一个新行,可以很容易地确定它将插入到p2
分区中,但是如果增加了一个编号为第21
的商店,将会发生什么呢?在这种方案下,由于没有规则把store_id
大于20
的商店包含在内,服务器将不知道把该行保存在何处,将会导致错误。 要避免这种错误,可以通过在CREATE TABLE
语句中使用一个“catchall
” VALUES LESS THAN
子句,该子句提供给所有大于明确指定的最高值的值:
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 NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
MAXVALUE
表示最大的可能的整数值。现在,store_id
列值大于或等于16
(定义了的最高值)的所有行都将保存在分区p3
中。在将来的某个时候,当商店数已经增长到25, 30,
或更多 ,可以使用ALTER TABLE
语句为商店21-25, 26-30,
等等增加新的分区 。
在几乎一样的结构中,你还可以基于雇员的工作代码来分割表,也就是说,基于job_code
列值的连续区间。例如——假定2
位数字的工作代码用来表示普通(店内的)工人,三个数字代码表示办公室和支持人员,四个数字代码表示管理层,你可以使用下面的语句创建该分区表:
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 NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (job_code) (
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (10000)
);
在这个例子中,
店内工人相关的所有行将保存在分区p0
中,办公室和支持人员相关的所有行保存在分区p1
中,管理层相关的所有行保存在分区p2
中。
在VALUES LESS THAN
子句中使用一个表达式也是可能的。这里最值得注意的限制是MySQL
必须能够计算表达式的返回值作为LESS THAN (<)
比较的一部分;因此,表达式的值不能为NULL
。由于这个原因,雇员表的hired, separated, job_code,
和store_id
列已经被定义为非空(NOT NULL
)。
分享到:
相关推荐
在介绍MySQL中创建数据表的Range分区之前,首先需要了解分区的概念。分区是将一个表中的数据分成多个更小的、更易于管理的部分的技术。这通常用于大型数据库,可以提高查询性能,便于数据维护和备份。MySQL支持多种...
**示例:RANGE分区创建** ```sql CREATE TABLE p_range ( id INT(10) NOT NULL AUTO_INCREMENT, name CHAR(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 PARTITION...
本文将深入探讨如何实现MySQL的自动创建与删除分区,主要关注时间分区,并介绍相关存储过程和事件的设置。 首先,我们需要理解MySQL分区的概念。分区是将一个大表逻辑上划分为多个较小的部分,每个部分称为一个分区...
- **RANGE分区**:根据表中某一列的值属于某个连续区间来分配数据行到相应的分区。例如,可以按照员工工资的不同范围进行分区。 - **LIST分区**:与RANGE分区类似,但是LIST分区是基于列值是否匹配于一个离散的值...
MySQL表分区支持不同的分区策略,例如range分区、list分区和hash分区等。 **range分区**是根据数据范围来进行分区的一种方法。它允许数据根据列值的范围被分配到不同的分区中。例如,可以根据日期、数值或其他连续...
`savepro.sql`文件可能包含SQL脚本,用于创建、插入数据或者备份和恢复MySQL数据库中的分区表。在实际操作中,你需要使用MySQL客户端工具(如MySQL Workbench或命令行客户端)来执行这些脚本。 为了充分利用分区,...
通过上述介绍可以看出,RANGE分区是MySQL数据库中一种非常实用且功能强大的特性,它不仅能够显著提高大型表的查询性能,还能够简化数据管理流程。理解并合理运用RANGE分区策略,对于提升数据库性能具有重要意义。
1. Range分区:这种分区方式基于列值的范围进行划分,适用于那些具有连续性或时间序列的数据,例如日期。例如,可以创建一个按月份划分的分区,所有2010年1月的数据存放在一个分区,2月的数据存放在另一个分区。如果...
MySQL的表分区是一种数据库优化策略,它将一个大表分解为多个较小的、更易管理和查询的部分,以提高数据检索速度和数据库性能。这一技术自MySQL 5.1版本开始被广泛支持。表分区主要应用于大数据量的场景,通过合理...
介绍 RANGE分区基于一个给定的连续...本文将给大家介绍MySQL 5.5 range分区增加删除处理的相关内容,分享给大家供大家参考学习,下面来看看详细的介绍: 一、删除分区 ##查看要处理的分区的数据量,并导出作为备份 mys
下面是一些分区创建的例子: 1. **RANGE 分区示例**: ```sql CREATE TABLE t_range ( id INT(11), money INT(11) UNSIGNED NOT NULL, date DATETIME ) PARTITION BY RANGE (YEAR(date)) ( PARTITION p2007 ...
针对大规模数据存储,MySQL 提供了一种高效的管理策略——分区(Partitioning),这有助于提高查询性能,尤其是在处理海量数据时。分区是将一个大表划分为逻辑上独立的部分,每个部分(或称为分区)可以在物理上分散...
- 子分区的创建,例如将Range分区进一步细分为两个子分区。 - 数据迁移和处理,例如将5月数据复制到新表,增加amount后再放回原分区表。 - 计算不同分区数下的Hash值,理解其分布规律。 3. **问题与解决**: - ...
1. **分区类型**:MySQL支持多种分区类型,包括范围(RANGE)、列表(LIST)、哈希(HASH)和键值(KEY)。范围分区通常基于数值或日期范围,列表分区则根据指定的值列表进行划分,哈希分区基于用户定义的函数,而...
1. **RANGE分区**: RANGE 分区是根据列值属于一个预定义的连续区间来分配数据。在示例中,`employees` 表被按照 `store_id` 列的值范围进行分区,如 `PARTITION p0 VALUES LESS THAN (6)`,这意味着所有 `store_id...
- **Range分区**:根据一个列的值范围进行分区。例如,根据日期的不同年份来划分分区。 - **Hash分区**:基于列值的哈希函数计算结果来进行分区。这种方式适合于数据分布均匀的场景。 - **Key分区**:类似于Hash分区...
例如,如果有一个日期字段,可以创建多个RANGE分区来存储特定日期范围内的数据。 2. LIST分区:类似于RANGE分区,但是LIST分区是基于列值的列表来分区。如果列值匹配列表中的某个特定值,则该行数据会被存放到对应...