Mysql四种分区方式以及组合分区落地实现详解

作者:广海_小疯疯丶 时间:2024-01-23 05:05:25 

看这篇文章前需要先了解一下以下几个问题~

一、问题

1.分区是什么

分区:就是把一张表数据分块存储

目的:提升索引的查询效率

2.Mysql为什么要使用分区

先从数据分析

然后进行索引优化

然后引入分区

3.Mysql中分区原理

客户端---------> Id 和分区键进行比较------------->找到指定分区---------->和数据库查询一致

4.Mysql中分区局限

必须使用分区字段才行,不然分区查询就会失败。走所有分区。

目前Range是范围分区,但是有时候我们会发现。分区大小永远是静态的。

所以会存在一个分区表大小不均。如何让分区表大小均衡呢?

二、分区落地实现

1.Range分区

条件

  • Product-Partiton表

步骤

1、先创建Product-Partiton-Range

CREATE TABLE `product-Partiton-Range` (
`Id` BIGINT(8) NOT NULL,
`ProductName` CHAR(245) NOT NULL DEFAULT '1',
`ProductId` CHAR(255) NOT NULL DEFAULT '1',
`ProductDescription` CHAR(255) NOT NULL DEFAULT '1',
`ProductUrl` CHAR(255) NOT NULL DEFAULT '1',
PRIMARY KEY (`Id`),
INDEX `ProductId` (`ProductId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY RANGE (Id) PARTITIONS 3 (
PARTITION part0 VALUES LESS THAN (12980),
PARTITION part1 VALUES LESS THAN (25960),
PARTITION part2 VALUES LESS THAN MAXVALUE);

2、然后查询分区表

select * from product-Partiton-Range where Id = 25000

2.Hash分区

步骤

1、先创建Product-Partiton-Hash

CREATE TABLE `product-Partiton-Hash` (
   `Id` BIGINT(8) NOT NULL,
   `ProductName` CHAR(245) NOT NULL DEFAULT '1',
   `ProductId` CHAR(255) NOT NULL DEFAULT '1',
   `ProductDescription` CHAR(255) NOT NULL DEFAULT '1',
   `ProductUrl` CHAR(255) NOT NULL DEFAULT '1',
   PRIMARY KEY (`Id`),
   INDEX `ProductId` (`ProductId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY HASH (Id) PARTITIONS 3;

Hash分区只能进行数字字段进行分区,无法进行字符字段进行分区。如果需要对字段值进行分区。

必须包含在主键字段内。

3.Key分区

步骤

1、先创建Product-Partiton-Key

CREATE TABLE `product-Partiton-Key` (
`Id` BIGINT(8) NOT NULL,
`ProductName` CHAR(245) NOT NULL DEFAULT '1',
`ProductId` CHAR(255) NOT NULL DEFAULT '1',
`ProductDescription` CHAR(255) NOT NULL DEFAULT '1',
`ProductUrl` CHAR(255) NOT NULL DEFAULT '1',
PRIMARY KEY (`Id`),
INDEX `ProductId` (`ProductId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY KEY (ProductName) PARTITIONS 3;

#建立复合主键
CREATE TABLE `product-Partiton-Key` (
`Id` BIGINT(8) NOT NULL,
`ProductName` CHAR(245) NOT NULL DEFAULT '1',
`ProductId` CHAR(255) NOT NULL DEFAULT '1',
`ProductDescription` CHAR(255) NOT NULL DEFAULT '1',
`ProductUrl` CHAR(255) NOT NULL DEFAULT '1',
PRIMARY KEY (`Id`),
INDEX `ProductId` (`ProductId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY KEY (ProductName) PARTITIONS 3;

以上分区都是一个特点:所有的分区必须连续和连续大小进行分区。

我们再来看一个场景:如何对商品订单分区。

4.Mysql中如何落地List分区

步骤

1、先创建Product-Partiton-List

CREATE TABLE `product-Partiton-List` (
   `Id` BIGINT(8) NOT NULL,
   `ProductName` CHAR(245) NOT NULL DEFAULT '1',
   `ProductId` CHAR(255) NOT NULL DEFAULT '1',
   `ProductDescription` CHAR(255) NOT NULL DEFAULT '1',
   `ProductUrl` CHAR(255) NOT NULL DEFAULT '1',
   `ProductStatus` int NOT NULL DEFAULT 0,
   PRIMARY KEY (`Id`),
   INDEX `ProductId` (`ProductId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY LIST(ProductId) (
   PARTITION a VALUES IN (1,5,6),
   PARTITION b VALUES IN (2,7,8)
);

商品主键和商品名称进行分区。

5.Mysql中如何落地组合分区

步骤

CREATE TABLE `product-Partiton-flex` (
   `Id` BIGINT(8) NOT NULL,
   `ProductName` CHAR(245) NOT NULL DEFAULT '1',
   `ProductId` CHAR(255) NOT NULL DEFAULT '1',
   `ProductDescription` CHAR(255) NOT NULL DEFAULT '1',
   `ProductUrl` CHAR(255) NOT NULL DEFAULT '1',
   PRIMARY KEY (`Id`,`ProductName`),
   INDEX `ProductId` (`ProductId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY RANGE (Id) PARTITIONS 3
SUBPARTITION BY KEY(ProductName)
 SUBPARTITIONS 2 (
   PARTITION p0 VALUES LESS THAN (12980),
   PARTITION p1 VALUES LESS THAN (25960),
   PARTITION p2 VALUES LESS THAN MAXVALUE
);

三、Mysql如何管理分区

1.删除分区

ALERT TABLE users DROP PARTITION p0;
#删除分区 p0

2.重建分区

2.1RANGE 分区重建

ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000));  
#将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。

2.2 LIST 分区重建

ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13));
#将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。

2.3 HASH/KEY 分区重建

ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2;
#用 REORGANIZE 方式重建分区的数量变成2,在这里数量只能减少不能增加。想要增加可以用 ADD PARTITION 方法。

3. 新增分区

3.1 新增 RANGE 分区

#新增一个RANGE分区
ALTER TABLE category ADD PARTITION (PARTITION p4 VALUES IN (16,17,18,19)
           DATA DIRECTORY = '/data8/data'
           INDEX DIRECTORY = '/data9/idx');

3.2 新增 HASH/KEY 分区

ALTER TABLE users ADD PARTITION PARTITIONS 8;   #将分区总数扩展到8个。

3.3 给已有的表加上分区

alter table results partition by RANGE (month(ttime))
(
PARTITION p0 VALUES LESS THAN (1),
PARTITION p1 VALUES LESS THAN (2) ,
PARTITION p2 VALUES LESS THAN (3) ,
PARTITION p3 VALUES LESS THAN (4) ,
PARTITION p4 VALUES LESS THAN (5) ,
PARTITION p5 VALUES LESS THAN (6) ,
PARTITION p6 VALUES LESS THAN (7) ,
PARTITION p7 VALUES LESS THAN (8) ,
PARTITION p8 VALUES LESS THAN (9) ,
PARTITION p9 VALUES LESS THAN (10) ,
PARTITION p10 VALUES LESS THAN (11),
PARTITION p11 VALUES LESS THAN (12),
PARTITION P12 VALUES LESS THAN (13)
);

4.默认分区限制分区字段必须是主键(PRIMARY KEY)的一部分,去除此限制

[方法1] 使用ID:

mysql> ALTER TABLE np_pk
   ->     PARTITION BY HASH( TO_DAYS(added) )
   ->     PARTITIONS 4;
#ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
mysql> ALTER TABLE np_pk
   ->     PARTITION BY HASH(id)
   ->     PARTITIONS 4;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0

[方法2] 将原有PK去掉生成新PK

mysql> alter table results drop PRIMARY KEY;
Query OK, 5374850 rows affected (7 min 4.05 sec)
Records: 5374850 Duplicates: 0 Warnings: 0

mysql> alter table results add PRIMARY KEY(id, ttime);
Query OK, 5374850 rows affected (7 min 4.05 sec)
Records: 5374850 Duplicates: 0 Warnings: 0

来源:https://blog.csdn.net/qq_34202873/article/details/121111232

标签:mysql,分区,落地
0
投稿

猜你喜欢

  • 如何用C代码给Python写扩展库(Cython)

    2023-06-08 17:06:32
  • Python可变和不可变、类的私有属性实例分析

    2023-05-27 14:34:08
  • 详解Django中Request对象的相关用法

    2021-12-08 16:30:06
  • 使用selenium自动控制浏览器找不到Chromedriver问题

    2023-02-02 01:32:33
  • CGArt®2008 贺岁刊电子杂志玉鼠闹春

    2008-02-15 08:59:00
  • 在Pycharm中对代码进行注释和缩进的方法详解

    2023-09-27 23:55:26
  • 数据库设计工具MySQL Workbench使用教程(超级详细!)

    2024-01-29 01:26:22
  • CSS注意事项: 针对 Safari(WebKit)

    2008-10-29 11:57:00
  • python3.6.4安装opencv3.4.2的实现

    2021-08-07 22:48:56
  • php中Ctype函数用法详解

    2023-06-19 01:43:13
  • php5.3 不支持 session_register() 此函数已启用的解决方法

    2023-11-16 01:59:39
  • 基于bootstrap写的一点localStorage本地储存

    2024-05-10 14:00:12
  • 用户是如何浏览你的网站的

    2010-05-03 14:26:00
  • 详解Python异常处理中的Finally else的功能

    2023-08-19 01:01:20
  • 详解python调度框架APScheduler使用

    2021-11-05 22:55:36
  • JS实现动画中的布局转换

    2023-10-14 15:58:04
  • Python的输入,输出和标识符详解

    2021-03-26 21:50:42
  • Python 操作 MongoDB 讲解详细

    2021-11-28 10:00:46
  • Python实现的旋转数组功能算法示例

    2021-09-11 20:49:46
  • mysql 5.7.16 winx64安装配置方法图文教程

    2024-01-26 22:30:25
  • asp之家 网络编程 m.aspxhome.com