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中InnoDB存储引擎的锁的基本使用教程
May 26 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
MySQL派生表联表查询实战过程
Mar 20 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
进阶篇之linux环境下安装MySQL数据库
Apr 09 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
Apr 20 MySQL
Mysql数据库事务的脏读幻读及不可重复读详解
May 30 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
MySQL索引失效十种场景与优化方案
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
一个程序下载的管理程序(三)
2006/10/09 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
Python的gevent框架的入门教程
2015/04/29 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
出纳的岗位职责
2013/11/09 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
抗洪救灾标语
2014/10/08 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
初中班主任教育随笔
2015/08/15 职场文书
初中语文教学随笔
2015/08/15 职场文书
关于golang高并发的实现与注意事项说明
2021/05/08 Golang
Python&Matlab实现樱花的绘制
2022/04/07 Python