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复制问题的三个参数分析
Apr 07 MySQL
为什么mysql字段要使用NOT NULL
May 13 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL之PXC集群搭建的方法步骤
May 25 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
MySQL数据库如何给表设置约束详解
Mar 13 MySQL
MYSQL常用函数介绍
May 05 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 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 zend 相对路径问题
2009/01/12 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
2017/08/25 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
亚马逊印度站:Amazon.in
2017/10/15 全球购物
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
大一学生假期实习的自我评价
2013/10/12 职场文书
生物学学生自我评价
2014/01/17 职场文书
买房协议书
2014/04/11 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
大学推普周活动总结
2015/05/07 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android