MYSQL分区管理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
--在mysql5.6之后查看分区采用
show plugins;

--不论创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分
mysql> create table t1(id int not null,id2 int not null,unique key(id)) partition by hash(id2) partitions 4;    
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table is partitioning function


--innodb与分区表不兼容
Partitioned InnoDB tables cannot have foreign key references, nor can they have columns referenced by foreign keys.
InnoDB tables which have or which are referenced by foreign keys cannot be partitioned
mysql> alter table t2 add foreign key(id) references t1(id);
ERROR 1215 (HY000): Cannot add foreign key constraint

--查看分区表
select * from information_schema.partitions p where p.partition_name is not null
and p.table_name='t1';


--查看某一分区执行计划
mysql> explain partitions select * from t1 where id2=1;  
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | p1         | ALL  | NULL          | NULL | NULL    | NULL |    2 | Using where | 
+----+-------------+-------+------------+------+---------------+------+---------+------+------+-------------+

--查看某一分区内数据,如果有多个分区要查时,请使用分号隔开
mysql> select * from t1 partition(p1);                  
+----+-----+
| id | id2 |
+----+-----+
|  4 |   5 | 
|  8 |   9 | 
+----+-----+


--mysql不支持在日期类型上直接创建分区,必需借助于函数
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,
store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

--按月进行分区,还是利用的函数
CREATE TABLE t (
id INT NOT NULL,
fired_date DATE NOT NULL DEFAULT '1970-01-01'
)
PARTITION BY RANGE ( extract(YEAR_MONTH from fired_date) ) (
PARTITION p0 VALUES LESS THAN (201601),
PARTITION p1 VALUES LESS THAN (201602),
PARTITION p2 VALUES LESS THAN (201603),
PARTITION p3 VALUES LESS THAN MAXVALUE
);


--通过使用RANGE COLUMNS而不再需要使用函数
The use of partitioning columns employing date or time types other than DATE or DATETIME is not supported with RANGE COLUMNS
CREATE TABLE members (
firstname VARCHAR(25) NOT NULL,
lastname VARCHAR(25) NOT NULL,
username VARCHAR(16) NOT NULL,
email VARCHAR(35),
joined DATE 
)
PARTITION BY RANGE COLUMNS(joined) (
PARTITION p0 VALUES LESS THAN ('1960-01-01'),
PARTITION p1 VALUES LESS THAN ('1970-01-01'),
PARTITION p2 VALUES LESS THAN ('1980-01-01'),
PARTITION p3 VALUES LESS THAN ('1990-01-01'),
PARTITION p4 VALUES LESS THAN MAXVALUE
);

--对于range partition的null,mysql默认把它当作最小的值看待,如果列值为空,其会把它插入到第一个分区中
MariaDB [test]> insert into members(firstname,lastname,username) values ('rudy','gao','rudy.gao');
Query OK, 1 row affected (0.01 sec)

MariaDB [test]> select * from members;
+-----------+----------+----------+-------+--------+
| firstname | lastname | username | email | joined |
+-----------+----------+----------+-------+--------+
| rudy      | gao      | rudy.gao | NULL  | NULL   |
+-----------+----------+----------+-------+--------+
1 row in set (0.00 sec)
--在第一个分区中查询
MariaDB [test]> select * from members partition(p0);
+-----------+----------+----------+-------+--------+
| firstname | lastname | username | email | joined |
+-----------+----------+----------+-------+--------+
| rudy      | gao      | rudy.gao | NULL  | NULL   |
+-----------+----------+----------+-------+--------+


--对于list partition的null,如果没有指定一个list存储null时,其是不允许插入null值的
--A table that is partitioned by LIST admits NULL values if and only if one of its partitions is defined using that value-list that contains NULL. 
--The converse of this is that a table partitioned by LIST which does not explicitly use NULL in a value list rejects rows resulting in a NULL value for the partitioning expression
mysql> INSERT INTO ts1 VALUES (NULL, 'mothra');
ERROR 1504 (HY000): Table has no partition for value NULL

--对于hash或者key分区,null值被当做0处理
--NULL is handled somewhat differently for tables partitioned by HASH or KEY. 
--In these cases, any partition expression that yields a NULL value is treated as though its return value were zero



--注意对于RANGE COLUMNS其不能是表达式,但其可以接受多个列
 RANGE COLUMNS does not accept expressions, only names of columns.
 RANGE COLUMNS accepts a list of one or more columns
--如果RANGE COLUMNS有多列时,其必须满足所有列都符合相应条件时,才放入相对应的分区,否则会默认分区


CREATE TABLE rc1 (a INT,b INT)
PARTITION BY RANGE COLUMNS(a, b) (
PARTITION p0 VALUES LESS THAN (5, 12),
PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE)
);
mysql> INSERT INTO rc1 VALUES (5,10), (5,11), (5,12);
--查看各个分区表中行数
mysql> SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'rc1';
+----------------+------------+
| PARTITION_NAME | TABLE_ROWS |
+----------------+------------+
| p0             |          2 |
| p3             |          1 |
+----------------+------------+

--其类似于如下的sql比较
mysql> SELECT (5,10) < (5,12), (5,11) < (5,12), (5,12) < (5,12);


--创建以key为分区的表,需要一个主键,如果没有,则mysql使用默认的虚拟主键
--KEY takes only a list of zero or more column names. Any columns used as the partitioning key must comprise part or all of the table's primary key, 
--if the table has one. Where no column name is specified as the partitioning key, the table's primary key is used, if there is one
CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;



--对于已经创建的分区,最好不要改变它们的sql_mode
it is strongly recommended that you never change the server SQL mode after creating partitioned tables
Sometimes a change in the server SQL mode can make partitioned tables unusable
Differing SQL modes on master and slave can lead to partitioning expressions being evaluated differently








相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
28天前
|
SQL 监控 关系型数据库
MySQL如何查看每个分区的数据量
通过本文的介绍,您可以使用MySQL的 `INFORMATION_SCHEMA`查询每个分区的数据量。了解分区数据量对数据库优化和管理具有重要意义,可以帮助您优化查询性能、平衡数据负载和监控数据库健康状况。希望本文对您在MySQL分区管理和性能优化方面有所帮助。
76 1
|
2月前
|
存储 关系型数据库 MySQL
MySQL 如何查看每个分区的数据量
MySQL 如何查看每个分区的数据量
40 3
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
49 1
|
5月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之如何实现MySQL数据库的自动分区
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
65 7
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(4)-DCL(管理用户、权限控制)
MySQL数据库——SQL(4)-DCL(管理用户、权限控制)
44 1
|
6月前
|
存储 缓存 关系型数据库
心得经验总结:理解MySQL——并行数据库与分区(Partion)
心得经验总结:理解MySQL——并行数据库与分区(Partion)
46 0
|
7月前
|
存储 数据可视化 关系型数据库
【MySQL进阶之路 | 基础篇】创建和管理数据库
【MySQL进阶之路 | 基础篇】创建和管理数据库
|
6月前
|
SQL 关系型数据库 MySQL
MySQL管理与连接
MySQL管理与连接
|
7月前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用合集之PolarDB MySQL标准版中带有分区功能吗
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。