MySQL 表分区 Partition

MySQL InnoDB,MyISAM, 和 NDB 存储引擎都支持分区。

分区的过程就是将一个表和索引分成多个小的部分;逻辑上讲只有一个表和索引,但实际上由多个物理分区组成。

这点和分表不同,分表实际上是将一张表数据根据某些业务字段存储在多个表中。

1、查询是否支持分区功能

使用查询语句:show PLUGINS 查看:

partition    ACTIVE    STORAGE ENGINE        GPL

 

2、分区类型

1)RANGE 分区

根据给定的连续区间的列值进行分区。

2)LIST 分区

根据离散的值进行分区,创建分区时必须指定。

3)HASH 分区

根据用户自定义的表达式的返回值进行分区,返回值不能为负值。

创建分区时, 用户只需要进行哈希分区的列值或表达式,MySQL 自动选择数据的分区。

4)KEY 分区

使用数据库提供的哈希函数进行分区。

 

3、分区的使用

RANGE 分区主要用于日期列的分区,例如按年份分区,

create table stock_order(
id int ,
store_id int,
price decimal(10,2),
order_time datetime not null
)engine=INNODB
PARTITION BY RANGE(year(order_time)) 
(PARTITION p2018 VALUES less than (2018),
PARTITION p2019 VALUES less than (2019),
PARTITION p2020 VALUES less than (2020));

往表中写入几条数据:

insert into stock_order values (1, 101, 50, str_to_date('2018-06-20 10:25:30','%Y-%m-%d %T'));
insert into stock_order values (2, 102, 30.50, str_to_date('2018-05-20 15:25:30','%Y-%m-%d %T'));
insert into stock_order values (10001, 101, 60, str_to_date('2019-05-20 14:25:30','%Y-%m-%d %T'));
insert into stock_order values (10002, 103, 35, str_to_date('2019-06-20 11:55:20','%Y-%m-%d %T'));

添加数据落在不存在的分区的话,会报错:

insert into stock_order values (10002, 103, 35, str_to_date('2021-06-20 11:55:20','%Y-%m-%d %T'));

错误提示:

[SQL] insert into stock_order values (10002, 103, 35, str_to_date('2021-06-20 11:55:20','%Y-%m-%d %T'));
[Err] 1526 - Table has no partition for value 2021

添加分区:

alter table stock_order add PARTITION(PARTITION p2021 values less than (2021))

alter table stock_order add PARTITION(PARTITION p2022 values less than (2022))

4、查看分区数据

select table_name,partition_name, table_rows 
from information_schema.`PARTITIONS`
where table_schema=DATABASE() and table_name='stock_order';

返回:

stock_order    p2018    0
stock_order    p2019    2
stock_order    p2020    2
stock_order    p2021    0
stock_order    p2022    0
stock_order    p2022    0
 

5、分区好处

1)删除分区数据很方便:

alter table book_order drop partition p2018;

2)查询数据落在某个分区的话,速度会提升:

EXPLAIN PARTITIONS
select * from stock_order 
where order_time <='2019-12-31' and order_time>='2019-01-01'

1    SIMPLE    stock_order    p2020    ALL                    2    Using where
 

6、分区限制

1)如果表中存在主键或者唯一索引时,分区列必须是唯一索引的一个组成部分;如果表没有主键和唯一索引,则任意列都可以为分区列。

2)RANGE 类型分区,优化器只能对year(), to_days(), to_seconds(), unix_timestamp()这些函数进行优化选择

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中增加MySQL分区需要通过执行SQL语句来实现。首先,我们需要创建一个分区,并定义分区键。然后,我们使用Java的JDBC连接到MySQL数据库,并执行SQL语句来创建分区。 以下是一个示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class CreateTablePartitionDemo { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false"; String username = "root"; String password = "password"; try (Connection conn = DriverManager.getConnection(url, username, password); Statement stmt = conn.createStatement()) { // 创建分区 String sql = "CREATE TABLE mytable (id INT, name VARCHAR(100)) PARTITION BY RANGE (id) (PARTITION p0 VALUES LESS THAN (10), PARTITION p1 VALUES LESS THAN (20))"; stmt.executeUpdate(sql); System.out.println("创建成功!"); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们使用`jdbc:mysql://localhost:3306/mydatabase?useSSL=false`指定了MySQL的连接URL,以及用户名和密码。然后,我们通过调用`DriverManager.getConnection()`方法获取与数据库的连接。 接下来,我们通过`conn.createStatement()`创建一个`Statement`对象,并使用`executeUpdate()`方法执行SQL语句来创建分区。 在以上示例中,我们创建了一个名为`mytable`的,并按照`id`列的范围进行了分区分区键为`id`,范围分区包括`PARTITION p0 VALUES LESS THAN (10)`和`PARTITION p1 VALUES LESS THAN (20)`两个分区。 执行以上代码后,我们可以在MySQL数据库中看到新创建的分区

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值