Mysql分区 - Range分区

1、Range(范围) – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980’s)的数据,90年代(1990’s)的数据以及任何在2000年(包括2000年)后的数据。
2、Hash(哈希) – 这种模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如DBA可以建立一个对表主键进行分区的表。
3、Key(键值) – Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
4、List(预定义列表) – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA建立了一个横跨三个分区的表,分别根据2004年2005年和2006年值所对应的数据。
5、Composite(复合模式) – 很神秘吧,哈哈,其实是以上模式的组合使用而已,就不解释了。举例:在初始化已经进行了Range范围分区的表上,我们可以对其中一个分区再进行hash哈希分区。

结论

  • 分区和未分区占用文件空间大致相同 (数据和索引文件)
  • 如果查询语句中有未建立索引字段,分区时间远远优于未分区时间
  • 如果查询语句中字段建立了索引,分区和未分区的差别缩小,分区略优于未分区。
  • 对于大数据量,建议使用分区功能。
  • 去除不必要的字段
  • 根据手册, 增加myisam_max_sort_file_size 会增加分区性能( mysql重建索引时允许使用的临时文件最大大小)

一、RANGE分区

1、按范围分区的表的分区方式是,每个分区都包含分区表达式值位于给定范围内的行。范围应连续但不重叠,并使用小于运算符的值定义。

2、当往分区列中插入null值RANG 分区会将其当作最小值来处理即插入最小的分区中

1、创建分区

#创建新的表
CREATE TABLE `tesc`.`tange_test`  (
  `id` int NULL,
  `name` varchar(255) NULL,
  `date` datetime NULL 
)
PARTITION BY RANGE (year(date))
(
PARTITION p0 VALUES LESS THAN (1995) , PARTITION p1 VALUES LESS THAN (1996) ,
PARTITION p2 VALUES LESS THAN (1997) , PARTITION p3 VALUES LESS THAN (1998) , 
PARTITION p4 VALUES LESS THAN (1999) , PARTITION p5 VALUES LESS THAN (2000) , 
PARTITION p6 VALUES LESS THAN (2001) , PARTITION p7 VALUES LESS THAN (2002) , 
PARTITION p8 VALUES LESS THAN (2003) , PARTITION p9 VALUES LESS THAN (2004) , 
PARTITION p10 VALUES LESS THAN (2010), PARTITION p11 VALUES LESS THAN MAXVALUE 
);

#已存在的表
ALTER TABLE `tesc`.`tange_test` PARTITION BY RANGE (year(date)) 
(
PARTITION p0 VALUES LESS THAN (1995) , PARTITION p1 VALUES LESS THAN (1996) ,
PARTITION p2 VALUES LESS THAN (1997) , PARTITION p3 VALUES LESS THAN (1998) , 
PARTITION p4 VALUES LESS THAN (1999) , PARTITION p5 VALUES LESS THAN (2000) , 
PARTITION p6 VALUES LESS THAN (2001) , PARTITION p7 VALUES LESS THAN (2002) , 
PARTITION p8 VALUES LESS THAN (2003) , PARTITION p9 VALUES LESS THAN (2004) , 
PARTITION p10 VALUES LESS THAN (2010), PARTITION p11 VALUES LESS THAN MAXVALUE 
);

p0:指分区p0,这个分区名的取值可以随便取值只要同一个表里面的每个分区名不重复即可,也不需要非得从0开始,你也可以使用a、b、c、d。

THEN():分区的范围值,这个值只能的连续不重叠的从小到大的值。

插入测试数据

insert into tange_test(id,`name`,date) values(1,'zhangsan','1990-09-02'),(2,'lisi','2000-09-02'),(3,'wangwu','2011-09-02'),(4,'liuliu','2021-09-02');

在这里插入图片描述

2、删除分区

ALTER TABLE tange_test DROP PARTITION p11;

注意:通过这种删除分区的方式会将分区中的数据也删除,慎用!!!!。但是通过删除分区的方式删除数据会比delete快很多,因为它相当于删除一个数据库一样因为每个分区都是一个独立的数据文件。用来删除历史分区数据是非常好的办法。
在这里插入图片描述

3、增加分区

ALTER TABLE tange_test ADD PARTITION ( PARTITION p11 VALUES LESS THAN MAXVALUE );

注意:增加分区只能在最大端增加

4、拆分合并分区

无论是拆分还是合并分区都不能改变分区原本的覆盖范围,并且合并分区只能合并连续的分区不能跳过分区合并;并且不能改变分区的类型,例如不能把range分区改成key分区等。

拆分合并分区统称为重新定义分区,拆分分为不会造成数据的丢失,只将会将数据从一个分区移动到另一个分区。

原分区
在这里插入图片描述

1、将p0、p1合并成p0

ALTER TABLE tange_test REORGANIZE PARTITION p0,p1 
INTO (
	PARTITION p0 VALUES LESS THAN (1996)
);

在这里插入图片描述
2、将p0拆分成p0、p1

ALTER TABLE tange_test REORGANIZE PARTITION p0 
INTO (
	PARTITION p0 VALUES LESS THAN (1995),
	PARTITION p1 VALUES LESS THAN (1996)
);

在这里插入图片描述

5、移除表的分区

ALTER TABLE tange_test REMOVE PARTITIONING ;

注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除

### 回答1: MySQLRANGE 分区是一种分区类型,允许你根据给定的分区键范围将表分成多个不同的分区。这意味着,你可以指定多个值域,并为每个值域创建一个分区。在插入新行时,MySQL 会根据分区键的值将行存储到适当的分区中。 例如,假设你有一张名为 `sales` 的表,其中包含销售日期和销售额两个列。你可以使用 RANGE 分区将这张表分成几个不同的分区,每个分区包含一个时间段内的销售数据。 下面是一个使用 RANGE 分区的示例: ``` CREATE TABLE sales ( date DATE, amount DECIMAL(10,2) ) PARTITION BY RANGE (YEAR(date)) ( PARTITION p0 VALUES LESS THAN (2000), PARTITION p1 VALUES LESS THAN (2010), PARTITION p2 VALUES LESS THAN (2020), PARTITION p3 VALUES LESS THAN MAXVALUE ); ``` 这条语句会创建一张名为 `sales` 的表,该表被分成 4 个分区,分别对应日期在 2000 年之前、2000 年至 2010 年之间、2010 年至 2020 年之间、2020 年之后的销售数据。 ### 回答2: MySQLRANGE分区是一种在表中按照某个列的范围进行分区的方法。分区是将表中的数据按照一定的规则分割成多个独立的部分,每个部分称为一个分区RANGE分区是根据指定的列的取值范围来进行分区的。 在使用RANGE分区时,我们需要先定义分区函数,指定一个列作为分区键。然后可以根据这个列的范围来划分不同的分区,每个分区可以有自己独立的存储和索引。 例如,我们可以使用RANGE分区将一个订单表按照订单金额的范围进行分区。可以定义分区函数为根据订单金额,范围分为低价订单、中价订单和高价订单三个分区分区函数可以使用多种方式定义,包括使用整型、浮点型、日期型等等。 当我们插入新的订单数据时,系统会根据分区函数将新的数据插入到对应的分区中。这样,相同范围内的订单数据就可以放到同一个分区中,提高数据的查询效率。 同时,RANGE分区也提供了一些其他的灵活选项,如合并相邻的分区、添加新的分区等。这些操作可以帮助我们进行分区的优化和管理。 总的来说,RANGE分区是一种非常有用的MySQL分区方法。通过合理的定义分区函数,将数据按照某一列的取值范围进行划分,可以提高查询效率和管理数据的灵活性。 ### 回答3: MySQLRANGE分区是一种根据某个范围值将表分成多个分区的技术。在RANGE分区中,可以选择一个列作为分区依据,并根据该列的值的范围将表数据分成若干个分区RANGE分区的创建需要指定分区键,即用于分区的列。在创建表时,可以使用PARTITION BY RANGE(column)语法来指定分区列。然后,通过指定各个分区的范围值来定义分区。例如,可以使用PARTITION p0 VALUES LESS THAN (100)来定义一个分区范围,表示该分区所包含的数据的分区键值必须小于100。 使用RANGE分区可以实现数据的分布和查询的优化。分区可以根据数据的范围进行划分,使得相同范围的数据在同一个分区中,提高了查询效率。另外,对于某些特定的查询,可以仅对分区内的数据进行扫描,减少了扫描的数据量,进一步提高了查询性能。 RANGE分区还提供了一些管理分区的灵活性。可以通过增加或删除分区来控制数据的增长和存储的使用情况。还可以通过对不同分区采用不同的存储引擎来进一步优化性能。 总之,RANGE分区是一种将表数据按范围划分为多个分区的技术。它提供了优化查询性能、管理数据增长和灵活性等多种好处。在设计和使用数据库时,可以根据实际需求选择是否使用RANGE分区来提高系统的性能和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值