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 设置boolean类型的操作
Jun 04 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
MySQL慢查询优化解决问题
Mar 17 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
mysql5.5中文乱码问题解决的有用方法
May 30 MySQL
Mysql的Table doesn't exist问题及解决
Dec 24 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 简易输出CSV表格文件的方法详解
2013/06/20 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
2017/03/13 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
使用jQuery制作浮动工具栏的实例分享
2016/05/13 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
浅谈vue引用静态资源需要注意的事项
2018/09/28 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
[18:32]DOTA2 HEROS教学视频教你分分钟做大人-谜团
2014/06/12 DOTA
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
Django分页功能的实现代码详解
2019/07/29 Python
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
饿了么订餐官网:外卖、网上订餐
2019/06/28 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
如何利用cmp命令比较文件
2013/09/23 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
物业管理计划书
2014/01/10 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
房展策划方案
2014/06/07 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android