MySQL系列---分区表实验

news2024/11/23 22:34:55

目录

  • 通用核心
  • range分区
    • 分区表达式结果必须为整数
    • 必须连续递增区间
    • 插入区间必须存在
  • list分区
    • 分区表达式结果必须为整数
    • 分区枚举不可以重复
    • 插入区间必须存在
  • hash分区
    • 分区表达式结果必须为整数
    • 分区数量必须为正整数
    • 余数取摸决定分区
  • key分区
    • 分区表达式可以是任意类型
    • 分区表达式的类型决定了分区算法
    • 非整数分区表达式时极易分区不均衡
  • 总述

通用核心

  1. 分区字段必须是唯一索引和主键索引的一部分,原因就是,mysql中的主键、唯一限制都是通过索引实现的,唯一索引和主键索引只有一个区别那就是后者不能为null,同时,加了主键和唯一之后,该字段其实就可以省略index了,因为前两者本身就是特殊的索引,已经包含了索引的功能。
  2. 分区字段可以配合分区函数,只有数字类型和日期类型有可用的分区函数,字符类型等等是没有的

range分区

语法: PARTITION BY RANGE (expr) (PARTITION p0 VALUES LESS THAN (number))

核心: 整数表达式 + 连续递增区间 + switch判断逻辑

场景: 分区表达式范围变化

分区表达式结果必须为整数

DROP TABLE if EXISTS `test_range`;
CREATE TABLE `test_range` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by RANGE(`name`)(
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN MAXVALUE)

// 失败:Field 'name' is of a not allowed type for this type of partitioning
DROP TABLE if EXISTS `test_range`;
CREATE TABLE `test_range` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by RANGE(MD5(`name`))(
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN MAXVALUE)

// 失败: This partition function is not allowed
DROP TABLE if EXISTS `test_range`;
CREATE TABLE `test_range` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by RANGE(year(`time`))(
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN MAXVALUE)

// 成功

必须连续递增区间

DROP TABLE if EXISTS `test_range`;
CREATE TABLE `test_range` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by RANGE(year(`time`))(
PARTITION p0 VALUES LESS THAN (30),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (50),
PARTITION p3 VALUES LESS THAN MAXVALUE)

// 失败:VALUES LESS THAN value must be strictly increasing for each partition

插入区间必须存在

DROP TABLE if EXISTS `test_range`;
CREATE TABLE `test_range` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by RANGE(year(`time`))(
PARTITION p0 VALUES LESS THAN (30),
PARTITION p1 VALUES LESS THAN (40),
PARTITION p2 VALUES LESS THAN (50))

// 成功

无法插入分区之外的值:
在这里插入图片描述

list分区

语法: PARTITION BY LIST(expr) (PARTITION p0 VALUES IN (number1,number2))

核心: 整数表达式 + 不重复离散值逗号分隔

场景: 分区表达式为穷尽离散值

分区表达式结果必须为整数

DROP TABLE if EXISTS `test_list`;
CREATE TABLE `test_list` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by list(`name`)(
PARTITION p0 VALUES in ("h"),
PARTITION p1 VALUES in ("w"),
PARTITION p2 VALUES in ("m"))

// 失败:1697 - VALUES value for partition 'p0' must have type INT
DROP TABLE if EXISTS `test_list`;
CREATE TABLE `test_list` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by list(`age`)(
PARTITION p0 VALUES in (10,11),
PARTITION p1 VALUES in (20,21),
PARTITION p2 VALUES in (30,31))

// 成功

分区枚举不可以重复

DROP TABLE if EXISTS `test_list`;
CREATE TABLE `test_list` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='range分区测试'
PARTITION by list(`age`)(
PARTITION p0 VALUES in (10,11),
PARTITION p1 VALUES in (20,21,11),
PARTITION p2 VALUES in (30,31))

// 失败:> 1495 - Multiple definition of same constant in list partitioning

插入区间必须存在

同 range分区

hash分区

语法: PARTITION BY HASH(expr) PARTITIONS number;

核心: 整数表达式 + 正整数分区数量

场景: 分区表达式where查询

分区表达式结果必须为整数

DROP TABLE if EXISTS `test_hash`;
CREATE TABLE `test_hash` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION by HASH(`name`)PARTITIONS 4;

分区数量必须为正整数

DROP TABLE if EXISTS `test_hash`;
CREATE TABLE `test_hash` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION by HASH(`age`)PARTITIONS -1;

// 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 '-1' at line 8
DROP TABLE if EXISTS `test_hash`;
CREATE TABLE `test_hash` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION by HASH(`age`)PARTITIONS 0;

// 1504 - Number of partitions = 0 is not an allowed value

余数取摸决定分区

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

key分区

语法: PARTITION BY KSY(expr) PARTITIONS number;

核心: 任意表达式 + 正整数分区数量 + 服务器内置算法对任意数据类型求hash + 分区表达式非整数时极易分区不均衡

场景: 分区表达式where查询

分区表达式可以是任意类型

DROP TABLE if EXISTS `test_key`;
CREATE TABLE `test_key` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION by KEY(`time`)PARTITIONS 4;

// 成功
DROP TABLE if EXISTS `test_key`;
CREATE TABLE `test_key` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION by KEY(`name`)PARTITIONS 4;

// 成功
DROP TABLE if EXISTS `test_key`;
CREATE TABLE `test_key` (
  `id` int unsigned zerofill NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(99) NOT NULL,
	`age` int NOT NULL,
	`time` datetime NOT NULL,
  PRIMARY KEY (`id`,`name`,`time`,`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION by KEY(`age`)PARTITIONS 4;

// 成功

分区表达式的类型决定了分区算法

  1. 分区表达式的类型为整数:此时key分区完全等于hash分区
  2. 分区表达式的类型为字符串:对字符串求hash值进行hash算法
  3. 分区表达式的类型为日期:对日期求hash值进行hash算法
  4. 分区表达式的类型为其他:求hash值进行hash算法

非整数分区表达式时极易分区不均衡

  1. name VARCHAR(99) NOT NULL, 为key分区字段
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. time datetime NOT NULL, 为key分区字段
    在这里插入图片描述
    在这里插入图片描述

总述

  1. range和list基本类似,区别就是前者必须是递增离散值,后者是不重复枚举值,相同点是一旦分区未包含插入值会插入失败,插入查询性能也类似。
  2. hash和key基本类似,区别就是前者只支持整数表达式,后者可以接收任意表达式,但是其算法也都是把其他的数据类型转化成整数再求hash值,相同点是任意数据都可以插入成功
  3. key分区比较特殊,虽然可支持范围比较大,但是非整数表达式就行分区时极易造成分区不均衡,实际操作时key分区能支持的极限就是字符串了,同时尽量避免使用key分区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT发展到了什么程度?代码生成,程序员将被取代?

前言 ChatGPT 是一个基于人工智能的聊天机器人,由 OpenAI 开发。ChatGPT 的历史可以追溯到早期的语言模型,例如循环神经网络 (RNN) 和长短时记忆网络 (LSTM)。如今的 ChatGPT-3 则是最新的版本。 ChatGPT发展到了什么程度?代码生成&#xff0…

文件或目录损坏且无法读取

如上图报错,我们直接用cmd命令输入【CHKDSK C: /F】然后回车 电脑重启后可以了,希望能帮助各位小伙伴

半监督学习(主要伪标签方法)

半监督学习 1. 引言 应用场景:存在少量的有标签样本和大量的无标签样本的场景。在此应用场景下,通常标注数据是匮乏的,成本高的,难以获取的,与之相对应的是却存在大量的无标注数据。半监督学习的假设:决策…

Greenplum功能调研

Greenplum 介绍 文章目录 Greenplum 介绍1. 背景介绍2. 特点3. 架构4. MPP结构5. MVCC6. 语法结构7. GreenPlum集群常用命令7. 维护8. 参考 1. 背景介绍 Greenplum。公司成立于2003年,2006年推出了首款产品,其主营业务关注在数据仓库和商业智能方面.Gre…

K最近邻算法:简单高效的分类和回归方法(三)

文章目录 🍀引言🍀训练集和测试集🍀sklearn中封装好的train_test_split🍀超参数 🍀引言 本节以KNN算法为主,简单介绍一下训练集和测试集、超参数 🍀训练集和测试集 训练集和测试集是机器学习和深…

个人对智能家居平台选择的思考

本人之前开发过不少MicroPython程序,其中涉及到自动化以及局域网控制思路,也可以作为智能家居的实现方式。而NodeMCUESPHome的方案具有方便添加硬件、容易更新程序和容量占用小的优势,本人也查看过相关教程后感觉部署ESPHome和编译固件的步骤…

科学与信息化杂志科学与信息化杂志社科学与信息化编辑部2023年第14期目录

科学视野 现代技术角度下对光纤通信传输技术的思考 崔文佳1-3 浅谈非道路移动机械污染防治难点与对策 刘华4-6 基层公路养护档案管理 高富丽7-9《科学与信息化》投稿:cnqikantg126.com 奉贤区第二次全国污染源普查及防治对策建议 卫伟10-12 数字化赋能在国土空间治理…

工厂方法模式-java实现

介绍 工厂方法模式,通过把工厂抽象为一个接口,这样当我们新增具体产品的时候,就只需要实现一个新的具体工厂类即可。一个具体工厂类,对应着一个产品。 请注意:在工厂方法模式中,一个具体工厂类只对应生产…

vue3+vite配置多入口文件

1.修改vite.config.ts 文件: 2.在src目录底下建相应的html文件和对应的ts入口文件和vue文件,如下图: npm run dev运行后本地访问: http://127.0.0.1:5173/home_index.htmlnpm run build打包后的结构如图:

物联网的定义、原理、示例、未来

什么是物联网? 物联网 (IoT) 是指由嵌入传感器、软件和网络连接的物理设备、车辆、电器和其他物理对象组成的网络,允许它们收集和共享数据。这些设备(也称为“智能对象”)的范围可以从简单的“智能家居”设备(如智能恒温器)到可穿戴设备(如智能手表和支持RFID的服…

Anaconda Prompt使用pip安装PyQt5-tools后无法打开Spyder或闪退

艹!MLGBZD! 真TMD折腾人! 出现原因: 首次安装完Anaconda3-2023.07-1-Windows-x86_64.exe后首次打开Spyder,此时是没有问题的,然后打开Anaconda Prompt,查看有哪些包,pip list 这时候开始首次安…

k8s之Pod控制器

目录 一、Pod控制器及其功用二、pod控制器的多种类型2.1 pod容器中的有状态和无状态的区别 三、Deployment 控制器四、SatefulSet 控制器4.1 StatefulSet由以下几个部分组成4.2 为什么要有headless?4.3 为什么要有volumeClaimTemplate?4.4 滚动更新4.5 扩…

Rocketmq Filter 消息过滤(TAGS、SQL92)原理详解 源码解析

1. 背景 1.1 Rocketmq 支持的过滤方式 Rocketmq 作为金融级的业务消息中间件,拥有强大的消息过滤能力。其支持多种消息过滤方式: 表达式过滤:通过设置过滤表达式的方式进行过滤 TAG:根据消息的 tag 进行过滤。SQL92&#xff1a…

【每日一题】—— B. Maximum Rounding(Codeforces Round 891 (Div. 3))

🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…

UNIX网络编程——UDP协议,CS架构

目录 一.socket创建通信的套接字 二.IPv4地址结构 三.通用地址结构 四. 两种地址结构的使用场合 五.sendto发送数据 六.bind固定地址信息​编辑 七.recvfrom接受UDP的消息​编辑 一.socket创建通信的套接字 二.IPv4地址结构 三.通用地址结构 四. 两种地址结构的使用场合…

MySQL— 基础语法大全及操作演示!!

MySQL—— 基础 一、MySQL概述1.1 、数据库相关概念1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.4、DML2.5、DQL2.6、DCL 三、函数四、约束五、多表查询六、事务 一、MySQL概述 1.1 、数据库相关概念 数据库、数据库管理系统、SQL&a…

sql server 删除指定字符串

replace方法 update #test set FIVCODEreplace(FIVCODE,440,) WHERE SOURCEFENTRYID140728

嵌入式软件测试-测试类型

使用质量属性来定义测试类型,即回归到测试类型的本质。 如果测试负载在系统允许的负载范围内,那测试的是系统的功能,此时的测试属于功能性测试;若在此基础上再加大测试时间,那就是稳定性测试了,此时关注的…

有哪些常用的设计素材网站?

素材网站可以是设计师和创意人员的灵感来源。这些网站收集了各种类型的平面设计图片,包括标志、海报、网站设计、包装设计、插图等。在本文中,我将推荐15个平面设计图素材网站,以帮助您找到新的想法和灵感。 1.即时设计资源社区 即时设计资…

8月8日上课内容 研究nginx组件rewrite

location 匹配uri location 匹配的规则和优先级。(重点,面试会问,必须理解和掌握) nginx常用的变量,这个要求掌握 rewrite:重定向功能。有需要掌握,有需要理解的。 location匹配:…