mysql dbpartition by hash_MySQL HASH分区
介绍
基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH,对于非整形的字段只能通过表达式将其转换成整数。表达式可以是mysql中任意有效的函数或者表达式,对于非整形的HASH往表插入数据的过程中会多一步表达式的计算操作,所以不建议使用复杂的表达式这样会影响性能。
MYSQL支持两种HASH分区,常规HASH(HASH)和线性HASH(LINEAR HASH) 。
一、常规HASH
常规hash是基于分区个数的取模(%)运算。根据余数插入到指定的分区
CREATE TABLEtbhash (
idINT NOT NULL,
store_idINT)
PARTITIONBYHASH(store_id)
PARTITIONS4;
ALTER TABLE tbhash ADD INDEX ix_store_id(store_id);
INSERT INTO tbhash() VALUES(1,100),(1,101),(2,102),(3,103),(4,104);SELECTPARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSIONFROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tbhash';
其中100,104对4取模是0所以这两条数据被分配到了p0分区。
2.时间类型字段
CREATE TABLEemployees (
idINT NOT NULL,
hired DATENOT NULL DEFAULT '1970-01-01',
)
PARTITIONBY HASH( YEAR(hired) )
PARTITIONS4;
常规hash的分区非常的简便,通过取模的方式可以让数据非常平均的分布每一个分区,但是由于分区在创建表的时候已经固定了。如果新增或者收缩分区的数据迁移比较大。
二、线性HASH(LINEAR HASH)
LINEAR HASH和HASH的唯一区别就是PARTITION BY LINEAR HASH
CREATE TABLE tblinhash (
id INT NOT NULL,
hired DATE NOT NULL DEFAULT'1970-01-01')
PARTITION BY LINEAR HASH( YEAR(hired) )
PARTITIONS 6;
线性HASH的计算原理如下:
假设分区个数num=6,N表示数据最终存储的分区
sep1:V = POWER(2, CEILING(LOG(2, num))),LOG()是计算NUM以2为底的对数,CEILING()是向上取整,POWER()是取2的次方值;如果num的值是2的倍数那么这个表达式计算出来的结果不变。
V=POWER(2,CEILING(LOG(2,6)))
V=POWER(2,3)
V=8
sep2:N=values&(V-1);&位与运算,将两个值都转换成2进行求与运算,当都为1才为1;当num是2的倍数时由于V计算出来的结果不变,这时values&(V-1)=MOD(values/num)和时间HASH取模算出的结果是一致的,这时特殊情况只有当分区是2的倍数才是这种 情况。values是YEAR(hired)的值
sep3:while N>=num
sep3-1:N = N & (CEIL(V / 2) - 1)
例如:
1.当插入的值是'2003-04-14'时
V = POWER(2, CEILING( LOG(2,6) )) = 8
N = YEAR('2003-04-14') & (8 - 1)
= 2003 & 7
=3
(3 >= 6 is FALSE: record stored in partition #3),N不大于num所以存储在第3分区,注意这里的3指的是P3,分区号是从P0开始。
2.当插入的值是‘1998-10-19’
V = POWER(2, CEILING( LOG(2,6) )) = 8
N = YEAR('1998-10-19') & (8-1)
= 1998 & 7
= 6
(6 >= 6 is TRUE: additional step required),由于N>=num所以要进行第三步操作
N=N&(CEILING(8/2)-1)
=6&3
=2
(2>=6is FALSE:recored in partition #2),由于2不大于6所以存储在第2个分区,注意这里的3指的是P2,分区号是从P0开始。
INSERT INTO tblinhash() VALUES(1,'2003-04-14'),(2,'1998-10-19');
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblinhash';
EXPLAIN SELECT * FROM tblinhash WHERE hired='2003-04-14';
三、分区管理
常规HASH和线性HASH的增加收缩分区的原理是一样的。增加和收缩分区后原来的数据会根据现有的分区数量重新分布。HASH分区不能删除分区,所以不能使用DROP PARTITION操作进行分区删除操作;
只能通过ALTER TABLE ... COALESCE PARTITION num来合并分区,这里的num是减去的分区数量;
可以通过ALTER TABLE ... ADD PARTITION PARTITIONS num来增加分区,这里是null是在原先基础上再增加的分区数量。
1.合并分区
减去3个分区
ALTER TABLE tblinhash COALESCE PARTITION 3;
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblinhash';
注意:减去两个分区后,数据根据现有的分区进行了重新的分布,以'2003-04-14'为例:POWER(2, CEILING( LOG(2,3) ))=4,2003&(4-1)=3,3>=3,3&(CEILING(3/2)-1)=1,所以现在的'2003-04-14'这条记录由原来的p3变成了p1
2.增加分区
增加4个分区
ALTER TABLE tblinhash add PARTITION partitions 4;
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblinhash';
当在3个分区的基础上增加4个分区后,‘2003-04-14’由原来的p1变成了p3,而另一条记录由原来的p2变成了p6
四、移除表的分区
ALTER TABLE tablename
REMOVE PARTITIONING ;
注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除
分区系列文章:
总结
常规HASH的数据分布更加均匀一些,也便于理解;目前还没有彻底理解为什么线性HASH在收缩和增加分区时处理的速度会更快,同时线性HASH的数据分布不均匀。
备注:
本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。
《欢迎交流讨论》
mysql dbpartition by hash_MySQL HASH分区相关推荐
- mysql的hash分区_MySQL中的分区(五)HASH分区
HASH分区主要用来分散热点读,取保数据在预先确定个数的分区中尽可能的平均分布.对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,一次确定数据应该放在哪一个分区中. MySQL分区支持 ...
- MySQL按字符串hash分区_MySQL学习笔记(14):分区
本文更新于2019-06-30,使用MySQL 5.7,操作系统为Deepin 15.4. 分区类型 可以使用SHOW PLUGINS查看是否安装了分区插件. MySQL创建分区表支持使用大部分存储引 ...
- mysql hash分区 数目_MySQL 分区
MySQL 分区 分区是指根据一定的规则,把一个表分解成多个更小更易管理的部分,逻辑上只有一个表或一个索引, 但是实际上该表可能由数个物理分区对象组成,每个分区都是一个独立的对象,每个分区可以独自处理 ...
- mysql 分区 线性hash_MySQL表分区(3)哈希分区-hash
哈希分区.哈希分区主要是依据表的某个字段以及指定分区的数量. 创建表分区 要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个"PARTITION BY HASH ( ...
- mysql的hash分区_MySQL中hash和key分区值的计算方法
MySQL中hash和key分区值的计算方法 mysql中有一种叫作key作为partition key的类型.来看看记录是怎么分布的 对于hash 分区,使用%操作符,每个partition key ...
- db2有主键时默认hash分区_彻底搞懂 MySQL 分区!
GrimMjxhttps://www.cnblogs.com/GrimMjx/p/10526821.html 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有 ...
- mysql hash分区 数目_mysql8 参考手册-HASH分区
分区依据HASH主要用于确保在预定数量的分区之间均匀分布数据.使用范围或列表分区时,必须明确指定应将给定列值或一组列值存储在哪个分区中:对于散列分区,此决定将由您来决定,您只需要根据要散列的列值以及要 ...
- mysql分区管理 - hash分区
2019独角兽企业重金招聘Python工程师标准>>> hash分区的目的是将数据按照某列进行hash计算后更加均匀的分散到各个分区,相比,range和list分区来说,hash分区 ...
- mysql 删除hash分区_MySQL-如何删除hash表分区
一个大表,之前是以hash分区表的形式存在的, MySQL> show create table history_uint; | history_uint | CREATE TABLE `his ...
最新文章
- 我说分布式事务之最大努力通知型事务
- 用python生成词云wordcloud
- JAVA——DES/ECB/PKCS7Padding加密算法[Cannot find any provider supporting DESEDE/CBC/PKCS7Padding]解决方案
- 突然被工信部重罚!阿里云到底干了啥?
- Calendar的那些神坑
- 单元测试——Winfrom
- java拼装树_java 数据拼装成树结构
- 年轻人应该做的和不该做的
- ipv6单播地址包括哪两种类型_IPv6基础介绍
- PhysioToolkit 软件目录
- rhel7.5安装mysql8.0教程_RHEL7.5下mysql 8.0.11安装教程
- UITextFiled 简介
- mysql msi失败_MySQL .msi 安装失败改用.zip安装步骤
- Python安装包下载、环境配置与工具包安装教程(详细版)
- 机器视觉技术的应用领域
- 智能电视软件安装(WIFI上网)
- 服装进销存软件哪个好?十大优质服装进销存管理软件排名
- 【统计学】三大相关系数之肯德尔相关系数(kendall correlation coefficient)
- fastbin attack学习总结
- 抖音二面:计算机网络-应用层