MySQL中创建partition表的几种方式

OS : linux

数据库:MySQL 8.0.25

MySQL中创建partition表的几种方式如下,这几种方式都是经过验证过的,只需将engine=xxx修改即可:

1. PARTITION BY RANGE

drop table if exists employees;

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) engine=xxx 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));

insert into employees(id,job_code,store_id) values(1,1001,5),(2,1002,10),(3,1003,15),(4,1004,20);

2.PARTITION BY LIST

drop table if exists employees;
CREATE TABLE employees (s1 int) engine=xxxx PARTITION BY LIST (s1) (PARTITION p1 VALUES IN (1), PARTITION p2 VALUES IN (2), PARTITION p3 VALUES IN (3), PARTITION p4 VALUES IN (4), PARTITION p5 VALUES IN (5));

INSERT INTO employees VALUES (1), (2), (3), (4), (5);

3.PARTITION BY LIST COLUMNS

drop table if exists employees;
CREATE TABLE employees(c1 int, c2 int, c3 int, c4 int, PRIMARY KEY (c1,c2)) engine=xxxx PARTITION BY LIST COLUMNS (c2) (PARTITION p1 VALUES IN (1,2), PARTITION p2 VALUES IN (3,4));
INSERT INTO employees VALUES (1, 1, 1, 1), (2, 3, 1, 1);
INSERT INTO employees VALUES (1, 2, 1, 1), (2, 4, 1, 1);
select * from employees;

4.PARTITION BY hash

drop table if exists employees;

create table employees (c1 int primary key, c2 varchar(50))engine=xxxx partition by hash (c1) partitions 2 (partition p1, partition p2);
insert into employees values(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd');

5.PARTITION BY key

drop table if exists employees;
create table employees (c1 int primary key, c2 varchar(50)) engine = xxx partition by key(c1) partitions 2 (partition p1, partition p2);
insert into employees values(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd');

6.subpartition by hash

drop table if exists employees;

create table employees (c1 int primary key, c2 int) engine=xxxx partition by range(c1) subpartition by hash (c1) subpartitions 2 (partition p0 values less than (100) (subpartition s0, subpartition s1), partition p1 values less than (200) (subpartition s2, subpartition s3));

insert into employees values(1, 1), (10, 10), (101, 101), (199, 199);

其中,个人比较喜欢的方式是partition by hash(c) partitions xxx.

欢迎补充其他的方式。

### MySQL 中 `PARTITION BY` 的替代方法及其有效使用 #### 使用窗口函数实现分区功能 自 MySQL 8.0 版本起引入了窗口函数,这使得无需依赖物理分区即可实现逻辑上的数据分组操作。通过 OVER 子句中的 PARTITION BY 可以轻松完成类似于传统 SQL 分区的功能。 ```sql SELECT department, employee_name, salary, AVG(salary) OVER(PARTITION BY department) as avg_salary_per_dept FROM employees; ``` 此查询会计算每个部门内员工工资的平均值[^1]。 #### 利用子查询模拟分区效果 对于较早版本的 MySQL 或者特定场景下不适用窗口函数的情况,则可以考虑采用子查询的方式来达到相同目的: ```sql SELECT e.department, e.employee_name, e.salary, d.avg_salary AS dept_avg_salary FROM employees e JOIN ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) d ON e.department = d.department; ``` 这种方法虽然效率可能不如窗口函数高,但在某些情况下仍然非常有用[^2]。 #### 创建临时或视图来处理复杂的数据集划分需求 当面对更复杂的业务逻辑时,创建专门用于存储中间结果的临时或是定义视图也是一种不错的选择。这样不仅可以简化最终查询语句,还能提高性能现。 ```sql CREATE TEMPORARY TABLE temp_employee_stats AS SELECT department, COUNT(*) emp_count, SUM(salary) total_salaries FROM employees GROUP BY department; -- 后续可以直接基于这个临时做进一步分析 ``` 以上几种方式都可以作为 MySQL 中 `PARTITION BY` 功能的有效补充,在不同应用场景中有各自的优势和局限性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值