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 06 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
mysql中between的边界,范围说明
Jun 08 MySQL
Mysql排序的特性详情
Nov 01 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
mysql全面解析json/数组
Jul 07 MySQL
MySQL 原理与优化之Update 优化
Aug 14 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
php文档更新介绍
2011/07/22 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
Python地图绘制实操详解
2019/03/04 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Python利用命名空间解析XML文档
2020/08/10 Python
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
幼儿园门卫岗位职责
2014/02/14 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
暑期教师培训方案
2014/06/07 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
学校实习推荐信
2015/03/27 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
2019年工作总结范文
2019/05/21 职场文书
Java实现房屋出租系统详解
2021/10/05 Java/Android
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL