介绍

基于给定的分区个数,将数据分配到不同的分区,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分区相关推荐

  1. mysql的hash分区_MySQL中的分区(五)HASH分区

    HASH分区主要用来分散热点读,取保数据在预先确定个数的分区中尽可能的平均分布.对一个表执行HASH分区时,MySQL会对分区键应用一个散列函数,一次确定数据应该放在哪一个分区中. MySQL分区支持 ...

  2. MySQL按字符串hash分区_MySQL学习笔记(14):分区

    本文更新于2019-06-30,使用MySQL 5.7,操作系统为Deepin 15.4. 分区类型 可以使用SHOW PLUGINS查看是否安装了分区插件. MySQL创建分区表支持使用大部分存储引 ...

  3. mysql hash分区 数目_MySQL 分区

    MySQL 分区 分区是指根据一定的规则,把一个表分解成多个更小更易管理的部分,逻辑上只有一个表或一个索引, 但是实际上该表可能由数个物理分区对象组成,每个分区都是一个独立的对象,每个分区可以独自处理 ...

  4. mysql 分区 线性hash_MySQL表分区(3)哈希分区-hash

    哈希分区.哈希分区主要是依据表的某个字段以及指定分区的数量. 创建表分区 要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个"PARTITION BY HASH ( ...

  5. mysql的hash分区_MySQL中hash和key分区值的计算方法

    MySQL中hash和key分区值的计算方法 mysql中有一种叫作key作为partition key的类型.来看看记录是怎么分布的 对于hash 分区,使用%操作符,每个partition key ...

  6. db2有主键时默认hash分区_彻底搞懂 MySQL 分区!

    GrimMjxhttps://www.cnblogs.com/GrimMjx/p/10526821.html 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有 ...

  7. mysql hash分区 数目_mysql8 参考手册-HASH分区

    分区依据HASH主要用于确保在预定数量的分区之间均匀分布数据.使用范围或列表分区时,必须明确指定应将给定列值或一组列值存储在哪个分区中:对于散列分区,此决定将由您来决定,您只需要根据要散列的列值以及要 ...

  8. mysql分区管理 - hash分区

    2019独角兽企业重金招聘Python工程师标准>>> hash分区的目的是将数据按照某列进行hash计算后更加均匀的分散到各个分区,相比,range和list分区来说,hash分区 ...

  9. mysql 删除hash分区_MySQL-如何删除hash表分区

    一个大表,之前是以hash分区表的形式存在的, MySQL> show create table history_uint; | history_uint | CREATE TABLE `his ...

最新文章

  1. 我说分布式事务之最大努力通知型事务
  2. 用python生成词云wordcloud
  3. JAVA——DES/ECB/PKCS7Padding加密算法[Cannot find any provider supporting DESEDE/CBC/PKCS7Padding]解决方案
  4. 突然被工信部重罚!阿里云到底干了啥?
  5. Calendar的那些神坑
  6. 单元测试——Winfrom
  7. java拼装树_java 数据拼装成树结构
  8. 年轻人应该做的和不该做的
  9. ipv6单播地址包括哪两种类型_IPv6基础介绍
  10. PhysioToolkit 软件目录
  11. rhel7.5安装mysql8.0教程_RHEL7.5下mysql 8.0.11安装教程
  12. UITextFiled 简介
  13. mysql msi失败_MySQL .msi 安装失败改用.zip安装步骤
  14. Python安装包下载、环境配置与工具包安装教程(详细版)
  15. 机器视觉技术的应用领域
  16. 智能电视软件安装(WIFI上网)
  17. 服装进销存软件哪个好?十大优质服装进销存管理软件排名
  18. 【统计学】三大相关系数之肯德尔相关系数(kendall correlation coefficient)
  19. fastbin attack学习总结
  20. 抖音二面:计算机网络-应用层

热门文章

  1. 10款Photoshop免费在线工具推荐
  2. 中式庭院,雅致生活,无法拒绝的美
  3. 【NOI2008】BZOJ1061志愿者招募
  4. 2021年G1工业锅炉司炉新版试题及G1工业锅炉司炉试题及解析
  5. 从零学Java(7)之数据类型,小AD竟然solo不过小朋友
  6. vscode中使用tensorboard的坑爹记录
  7. 制作随身携带的Kali linux,将kali装入U盘
  8. 为何16寸的笔记本电脑开始兴起?
  9. 网络爬虫-爬取京东商品评价数据
  10. 收藏一篇分析很到位的巨蟹座性格