mysql分区表的增删改查操作

一、mysql创建表分区

详情参考链接:mysql创建表分区详细介绍及示例

二、基本分区信息查询

官方链接 : mysql分区的相关增删改查操作

2.1 查看mysql版本是否支持分区

mysql> show plugins

即:看名为partition的插件是否为active,active表示支持分区。
1
并且同一个数据库,不同表支持分区可以是不同的存储引擎,但是表分区后所有的分区都必须和表使用相同引擎。

MyISAM和InnoDB都支持分区。
MySQL 8都无需插件即可支持分区,且只有InnoDB支持,MyISAM不支持分区。
MySQL 5.7 的NDB支持分区有自己的规则。
MySQL只支持水平分区,对垂直分区的支持无计划。

2.2 查看表是否为分区表

2.2.1 查询表分区信息

  1. 查看创建分区表的create语句show create table 表名;

示例:show create table dev_fac;
3

  1. 查看表是不是分区表:show table status;

示例:show table status;
4

2.2.2 查看表的所有分区

  查看对应数据库、对应表的所有分区信息

SELECT
	partition_name part,
	partition_expression expr,
	partition_description descr,
	table_rows
FROM
	INFORMATION_SCHEMA. PARTITIONS
WHERE
	TABLE_SCHEMA = "库名称"
AND TABLE_NAME = "表名称";

示例:

SELECT
	partition_name part,
	partition_expression expr,
	partition_description descr,
	table_rows
FROM
	INFORMATION_SCHEMA. PARTITIONS
WHERE
	TABLE_SCHEMA = "test"
AND TABLE_NAME = "dev_fac";

结果如下:
2

三、分区表的查询操作

MySQL 5.7支持显式选择分区和子分区,在执行语句时,应检查是否有与给定WHERE条件匹配的行。分区选择与分区精简相似,分区选择只检查特定分区的匹配情况,但在两个关键方面有所不同:

  1. 分区选择要检查的分区由语句的发布者指定,而分区精简它是自动的。
  2. 尽管分区精简仅适用于查询,但查询和许多DML语句都支持分区的显式选择。
  3. 支持显式分区选择的SQL语句如下:
SELECT * FROM 表名  PARTITION (分区名称1,分区名称2,分区名称n) WHERE 查询条件;

示例:3

  1. 隐式分区要注意where条件中需要包含分区的关键字,以确保查询时是通过分区查询,而不是全表扫描,查询语句如下:
SELECT * FROM 表名  WHERE 查询条件;

显示扫描哪些分区,及它们是如何使用的:
  在查询语句前面加上EXPLAIN PARTITIONS 关键字.

示例: EXPLAIN PARTITIONS SELECT * FROM dev_date WHERE Partition_Date = ‘2022-11-25 16:07:00’;
1

四、分区表的增删改操作

4.1 新增分区

4.1.1 给已有的表加上分区

alter table 表名 partition by 分区逻辑;

示例:

alter table results partition by RANGE (month(ttime)) (
PARTITION p5 VALUES LESS THAN (6) , 
PARTITION p11 VALUES LESS THAN (12),
PARTITION P12 VALUES LESS THAN MAXVALUE
);

4.1.2 新增分区

  新增分区需要先确认表为分区表。

alter table 表名 add partition (partition 分区名称 values less than (逻辑));

1. range添加新分区

mysql> alter table user add partition(partition p4 values less than MAXVALUE);

2. list添加新分区

mysql> alter table list_part add partition(partition p4 values in (25,26,28));

3. hash重新分区

mysql> alter table hash_part add partition partitions 4;

4.key重新分区

mysql> alter table key_part add partition partitions 4;

4.2 重新分区

1. range重新分区

mysql> ALTER TABLE user REORGANIZE PARTITION p0,p1,p2,p3,p4 INTO (PARTITION p0 VALUES LESS THAN MAXVALUE);

2. list重新分区

mysql> ALTER TABLE list_part REORGANIZE PARTITION p0,p1,p2,p3,p4 INTO (PARTITION p0 VALUES in (1,2,3,4,5));

3. hash和key分区不能用REORGANIZE,官方网站说的很清楚

mysql> ALTER TABLE key_part REORGANIZE PARTITION COALESCE PARTITION 9;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘PARTITION 9’ at line 1

4.3 删除

4.3.1 删除表

  表删除,对应的分区及数据也会删除。

DROP TABLE 表名称`;

4.3.2 删除分区

alter table 表名  drop partition 分区名称;
-- 示例
alter table staff  drop partition p0;

  如果你使用例子给出的分区方案,你只需执行语句alter table staff drop partition p0来删除所有在1991年前就已经停止工作的雇员相对应的所有行。对于有大量行的表,这比运行一个如”delete from staff WHERE year(separated) <= 1990;”这样的一个DELETE查询要有效得多。

4.3.4 删除指定分区中的数据

DELETE
FROM
	表名  PARTITION  (分区名称1,分区名称2,分区名称n)
WHERE 子句

示例:DELETE FROM dev_fac PARTITION(p1000000000000001) WHERE devName = ‘D10000000000000011名称’
5

4.4 数据插入

4.4.1 按表插入

  直接按表插入,数据库自动根据数据查找分区插入。

INSERT INTO `dev_fac`
VALUES
	(
		'D10000000000000010',
		'D10000000000000010名称',
		'F1000000000000001',
		'2022-11-25 16:07:00',
		'1',
		'1669363620000',
		'1',
		'1000000000000001',
		'2022-11-25 16:07:00'
	);

4.4.2 按分区插入

  插入语句中指定插入的分区信息。

INSERT INTO 表名  PARTITION  (分区名称1,分区名称2,分区名称n)
列名  VALUES()

示例:
INSERT INTO dev_fac PARTITION (1000000000000001)
VALUES(
‘D10000000000000012’,
‘D10000000000000012名称’,
‘F1000000000000001’,
‘2022-11-25 16:07:00’,
‘1’,
‘1669363620000’,
‘1’,
‘1000000000000001’,
‘2022-11-25 16:07:00’
);

4.4.2 按分区批量插入

  插入语句中指定插入的分区信息且一次插入多条数据。

INSERT INTO 表名  PARTITION  (分区名称1,分区名称2,分区名称n)
列名  VALUES(),(),(),...,()

示例:

INSERT INTO `dev_fac` PARTITION (p1000000000000001)
VALUES(
		'D10000000000000012',
		'D10000000000000012名称',
		'F1000000000000001',
		'2022-11-25 16:07:00',
		'1',
		'1669363620000',
		'1',
		'1000000000000001',
		'2022-11-25 17:07:00'
	),
	(
		'D10000000000000013',
		'D10000000000000013名称',
		'F1000000000000001',
		'2022-11-25 16:07:00',
		'1',
		'1669363620000',
		'1',
		'1000000000000001',
		'2022-11-25 17:07:00'
	);

6

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL分区是将大按照一定的规则分割成若干个小,这些小在物理上是独立存在的,但逻辑上是整体。分区可以提高询和维护的效率,减少数据库的碎片。 MySQL 支持以下几种分区类型: 1. RANGE分区: 按照范围将数据分配到不同的分区,常用于时间数据。 2. LIST分区: 按照值列将数据分配到不同的分区。 3. HASH分区: 根据哈希算法将数据分配到不同的分区。 4. KEY分区: 按照主键将数据分配到不同的分区 MySQL 中建立分区的方法,分区与普通建立方法基本相同,唯一的区别就是在定义的时候需要使用PARTITION BY子句来定义分区。例如: ``` CREATE TABLE sales ( item_id INT NOT NULL, sale_date DATE NOT NULL, sale_quantity INT NOT NULL ) PARTITION BY RANGE (sale_date) ( PARTITION p0 VALUES LESS THAN ('2010-01-01'), PARTITION p1 VALUES LESS THAN ('2010-07-01'), PARTITION p2 VALUES LESS THAN (MAXVALUE) ); ``` 创建完成之后,你就可以对这个分区进行增删操作了。 使用分区的时候要注意,对于分区字段进行索引会提高询效率,但是如果分区字段不能唯一确定一条记录,那 ### 回答2: MySQL分区是将一个大的拆分成若干个小的子,每个子称为一个分区分区的目的是提高询和维护的效率。 分区的好处有: 1.询效率提升:在询时,可以只扫描特定的分区,减少了扫描整个的时间消耗。 2.维护效率提升:可以只对需要维护的分区进行操作,减少了维护整个的时间消耗。 3.提高存储效率:使用分区可以根据业务需求,将不同部分的数据放在不同的存储设备上,优化存储结构。 MySQL分区支持以下几种分区策略: 1.按范围分区(Range Partitioning):根据某一列的值范围进行分区,例如按照时间范围、数字范围等进行分区。 2.按列分区(List Partitioning):根据某一列的值的列进行分区,例如按照指定的一些常量值进行分区。 3.按哈希分区(Hash Partitioning):根据某一列的哈希值进行分区,可以均匀地将数据分布到多个分区中。 4.按键值分区(Key Partitioning):根据某一列的键值进行分区,适用于键值的范围分布不均匀的情况。 在创建分区时,需要指定分区列和分区类型,并设置分区策略。例如,可以使用以下DDL语句创建按范围分区分区: CREATE TABLE orders ( order_id INT, order_date DATE, order_amount DECIMAL(10,2) ) PARTITION BY RANGE (YEAR(order_date)) ( PARTITION p0 VALUES LESS THAN (2010), PARTITION p1 VALUES LESS THAN (2015), PARTITION p2 VALUES LESS THAN (2020), PARTITION p3 VALUES LESS THAN MAXVALUE ); 在询时,可以通过指定分区条件进行询,例如: SELECT * FROM orders PARTITION (p2) WHERE order_date BETWEEN '2015-01-01' AND '2019-12-31'; 需要注意的是,分区结构必须保持一致,且分区列不能为NULL。另外,分区的性能受到硬件设备、分区策略和数据分布等多个因素的影响,需要根据具体的业务需求和数据库配置进行合理的设计和优化。 ### 回答3: MySQL分区是指将一个按照一定的规则分割成多个分区,每个分区可以独立地存储和管理数据。分区可以提高询性能、降低维护成本,并且支持更好的数据组织和管理。 MySQL分区可以按照多种规则进行分区,常见的有范围分区、列分区和哈希分区。 范围分区是按照指定的列值范围将分成多个分区,常见的列可以是日期或者数值类型。例如,可以按照订单的创建日期范围将订单分成每个分区存储一个月的数据。这样可以加快询速度,避免扫描整个的数据。 列分区是按照指定的列值列分成多个分区,常见的列可以是国家、城市等。例如,可以按照订单的国家将订单分成多个分区,每个分区分别存储不同国家的订单数据。 哈希分区是根据指定的列值进行哈希计算,将分成多个分区。哈希分区可以均匀地分布数据,但是分区后无法直接根据列值范围进行询。 除了上述的分区规则,MySQL还支持根据日期和时间进行分区,这样可以更精细地按照时间来管理数据。 使用分区的好处有: 1. 提高询性能:在询时只需要扫描部分分区,而不用扫描整个,可以大大减少询时间。 2. 降低维护成本:可以针对某个分区进行备份、修复或优化,而不用对整个进行操作,简化了维护工作。 3. 更好的数据组织和管理:可以将不同特性的数据存储在不同分区,提高数据的组织和管理效率。 需要注意的是,分区的创建和使用需要符合一些限制条件,例如分区列必须包含在主键或唯一索引中,还有一些对分区操作是不支持的,如不支持外键关系等。 总之,MySQL分区可以提高询性能、降低维护成本,并且支持更好的数据组织和管理,是一个值得使用的数据库分区技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值