MySql分区类型及创建分区的方法


Posted in MySQL onApril 13, 2022

一、Mysql分区类型

1、RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。

2、HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

3、KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

4、复合分区:基于RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。

二、RANGE分区

缺点:1、只能通过整形类型的主键建进行分区

2、分区数据不平均

1、创建分区

DROP TABLE IF EXISTS `product_partiton_range`;
CREATE TABLE `product_partiton_range`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 

PARTITION BY RANGE (Id) PARTITIONS 3 (
PARTITION part0 VALUES LESS THAN (1000), 
PARTITION part1 VALUES LESS THAN (2000), 
PARTITION part2 VALUES LESS THAN MAXVALUE);

2、批量添加数据

DROP PROCEDURE IF EXISTS PROC_USER_INSERT;
delimiter $$
-- 创建存储过程
CREATE  PROCEDURE PROC_USER_INSERT(
IN START_NUM INT,
IN MAX_NUM INT
)
BEGIN 

DECLARE TEMP_NUM INT DEFAULT 0;
SET TEMP_NUM=START_NUM;

WHILE TEMP_NUM<=MAX_NUM  DO
    INSERT INTO product_partiton_range(ProductName,ProductId) VALUES('XIAOHEMIAO',TEMP_NUM);
    SET TEMP_NUM=TEMP_NUM+1;
END WHILE;


END$$ ;
delimiter;

-- 调用存储过程
CALL PROC_USER_INSERT(1,5000);

3、通过EXPLAIN PARTITIONS命令发现SQL优化器只需搜对应的区,不会搜索所有分区

MySql分区类型及创建分区的方法

4、如果sql语句有问题,那么会走所有区。会很危险。所以分区表后,select语句必须走分区键。

MySql分区类型及创建分区的方法

5、查看当前表的分区情况

SELECT
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
FROM information_schema.partitions WHERE
table_schema = SCHEMA()
AND table_name='product_partiton_range';

MySql分区类型及创建分区的方法

二、Hash分区

优点:分区数据比较平均

缺陷:HASH分区只能对数字字段进行分区,无法对字符字段进行分区。如果需要对字段值进行分区,必须包含在主键字段内

1、创建分区

DROP TABLE IF EXISTS `product_partiton_hash`;
CREATE TABLE `product_partiton_hash`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 

PARTITION BY HASH (Id) PARTITIONS 3 ;

三、Key分区

优点:除了text,blob类型字段,其他类型字段都可以进行分区

缺陷:不支持text,blob(二进制)类型的字段进行分区

1、创建分区

DROP TABLE IF EXISTS `product_partiton_key`;
CREATE TABLE `product_partiton_key`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
  PRIMARY KEY (`Id`,`ProductName`) ,
  INDEX `ProductId_index`(`ProductId`) 
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 
PARTITION BY KEY (ProductName) PARTITIONS 3 ;

四、List分区

优点:支持枚举类型的字段进行分区,比如商品状态,商品类型

1、创建分区

DROP TABLE IF EXISTS `product_partiton_list`;
CREATE TABLE `product_partiton_list`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
    `ProductStatus` int(11) NOT NULL,
  PRIMARY KEY (`Id`,`ProductStatus`) ,
  INDEX `ProductId_index` (`ProductId`) 
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 
PARTITION BY LIST(ProductStatus)(
    PARTITION p0 VALUES in(0,1),
    PARTITION p1 VALUES in(2,3,4)
);

2、插入数据

INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,0);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,1);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,2);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,3);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,4);

3、查看当前表的分区情况

MySql分区类型及创建分区的方法

附:查询分区,各区表数据量

SELECT PARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'table';

总结

1、分区字段必须是主键

2、分区字段,必须以分区字段进行查询,否则分区失效

到此这篇关于MySql创建分区的文章就介绍到这了!

MySQL 相关文章推荐
mysql知识点整理
Apr 05 MySQL
MySql学习笔记之事务隔离级别详解
May 12 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
MySQL系列之十四 MySQL的高可用实现
Jul 02 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
mysql sql常用语句大全
Jun 21 MySQL
关于MySQL中explain工具的使用
May 08 MySQL
深入理解mysql事务隔离级别和存储引擎
mysql使用 not int 子查询隐含陷阱
Apr 12 #MySQL
MySQL数据库如何使用Shell进行连接
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 #MySQL
MySQL事务操作的四大特性以及并发事务问题
MySql重置root密码 --skip-grant-tables
MySQL库表太大怎么办? 数据库分库分表项目实践
You might like
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php去除二维数组的重复项方法
2015/11/03 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
2016/03/21 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
php给数组赋值的实例方法
2019/09/26 PHP
列表内容的选择
2006/06/30 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
2013/04/25 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
js定时器+简单的动画效果实例
2017/11/10 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
python验证码识别的实例详解
2016/09/09 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python实现词法分析器
2019/01/31 Python
Python中py文件转换成exe可执行文件的方法
2019/06/14 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
Python过滤序列元素的方法
2020/07/31 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
幼儿园中秋节活动总结
2015/03/23 职场文书
红色电影观后感
2015/06/18 职场文书
会计入职心得体会
2016/01/22 职场文书
python基础之爬虫入门
2021/05/10 Python