本文更新于2019-06-30,使用MySQL 5.7,操作系统为Deepin 15.4。

分区类型

可以使用SHOW PLUGINS查看是否安装了分区插件。

MySQL创建分区表支持使用大部分存储引擎,但不支持使用MERGE或CSV存储引擎。同一个分区表的所有分区必须使用同一种存储引擎。

MySQL分区作用于整个表的所有数据和索引,其索引一定是本地LOCAL索引。

无论那种分区类型,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键包含分区键。

分区表中的分区名不区分大小写。

可以通过查询information_schema.PARTITIONS得知分区中的行数,来间接确定记录是插入到那一个分区中的:

SELECT PARTITION_NAME, PARTITION_EXPRESSION, PARTITION_DESCRIPTION, TABLE_ROWS

FROM information_schema.PARTITIONS

WHERE TABLE_SCHEMA = dbname AND TABLE_NAME = tablename

Range分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]

PARTITION BY RANGE [COLUMNS] (partitionkey[, ...]) (

PARTITION partitionname VALUES LESS THAN (value)|MAXVALUE

[, ...]

)

如不使用COLUMNS,则Range分区的分区键必需为INT类型的某一列,或某一返回INT类型的表达式。如使用COLUMNS,则为Range Columns分区,分区键可为非INT类型,可为多列分区,不能为表达式。

Range分区的区间必须连续且不能互相重叠,区间为左闭右开区间。每个分区都是按顺序进行定义的,从最低到最高。

分区键的值如果是NULL则会被当作最小值来处理。

List分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]

PARTITION BY LIST [COLUMNS] (partitionkey[, ...]) (

PARTITION partitionname VALUES IN (value[, ...])

[, ...]

)

如不使用COLUMNS,List分区的分区键必需为INT类型的某一列,或某一返回INT类型的表达式。如使用COLUMNS,则为List Columns分区,分区键可为非INT类型,可为多列分区,不能为表达式。

List分区的声明不必按照特定的顺序。

分区键的值如果是NULL则必须出现在分区定义的枚举列表中。

Columns分区

Columns分区可分为Range Columns分区和List Columns分区,其分区键都支持整数、日期时间、字符串数据类型。

所有整数类型,即TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,不支持其他数值类型。

日期时间类型DATE和DATETIME。分区日期处理支持的函数有YEAR()、TO_DAYS()、TO_SECONDS()。

字符串类型CHAR、VARCHAR、BINARY、VARBINARY,不支持[*]TEXT和[*]BLOB。

Columns分区可使用一列或多列作为分区键,即支持多列分区,不支持表达式作为分区键。其分区键是基于元组的比较,即多列排序。

Hash分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]

PARTITION BY [LINEAR] HASH(partitionkey)

PARTITIONS count

MySQL支持两种Hash分区,常规Hash分区和线性Hash分区。常规Hash分区使用的是取模算法,线性Hash分区使用的是一个线性的2的幂的运算法则。常规Hash分区在分区管理(增加、删除、合并、拆分分区)时代价较大,线程Hash分区在分区管理时能处理得更迅速,但各个分区之间数据分布不太均匀。常规Hash分区将记录保存到分区编号为MOD(partitionkey, count)的分区中,线性Hash分区保存的分区编号按照如下规则计算。当线性Hash分区的个数为2的幂的时候,其和常规Hash分区的分区结果是一致的。

找到下一个大于等于count的2的幂V = Power(2, Ceiling(Log(2, count))),V有可能大于count。

设置N = partitionkey & (V - 1)。由上一步得,V - 1为一个所有位都为1的整数,运算结果N共有V种可能(0至V - 1)。

当N > count时,设置V = Ceiling(V / 2),由第一步得知该值肯定小于count且为一个2的幂。使用新的V设置N = N & (V - 1)即为分区编号。

Hash分区的分区键必需为INT类型的某一列,或某一返回INT类型的表达式。

分区键的值如果是NULL则会将其当作零值处理。

Key分区

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]

PARTITION BY [LINEAR] KEY ([partitionkey[, ...]])

PARTITIONS count

Key分区的分区键可为除[*]TEXT和[*]BLOB类型以外的一列或多列,不能为表达式。如未指定分区键,则使用主键作为分区键;若无主键,则选择非空唯一键作为分区键。MySQL使用服务器的HASH函数计算列的散列值。

分区键的值如果是NULL则会将其当作零值处理。

Key分区表不能执行ALTER TABLE DROP PRIMARY KEY来删除主键,否则会返回错误:Field in list of fields for partition function not found in table。

Key分区使用LINEAR和Hash分区有相同的作用。

子分区

Range分区和List分区可再进行子分区(复合分区),子分区可以使用Hash分区或Key分区。

CREATE TABLE tablename (...) [[STORAGE] ENGINE=engine]

PARTITION BY RANGE|LIST [COLUMNS] (partitionkey1[, ...])

SUBPARTITION BY HASH|KEY (partitionkey2[, ...])

SUBPARTITIONS count

(

PARTITION partitionname VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}

[, ...]

)

PARTITION子句的VALUES根据分区是Range分区还是List分区填写(下同)。

分区管理

Range分区和List分区的分区管理

删除分区,会同时删除分区中的数据:

ALTER TABLE tablename

DROP PARTITION partitionname

增加分区,Range分区只能添加分区至分区列表最大一端:

ALTER TABLE tablename

ADD PARTITION (

PARTITION partitionname VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}

)

重定义分区,不会丢失原有数据,可以用来拆分一个分区为多个分区,也可以用来合并多个相邻分区(指定义语句相邻)为一个分区或多个分区,同时重定义的分区范围必需与原分区相同:

ALTER TABLE tablename

REORGANIZE PARTITION partitionname1[, ...] INTO (

PARTITION partitionname2 VALUES {LESS THAN (value)|MAXVALUE}|{IN (value[, ...])}

[, ...]

)

如不使用相邻分区重定义,则会返回错误:When reorganizing a set of partitions they must be in consecutive order。

Hash分区和Key分区的分区管理

合并分区:

ALTER TABLE tablename

COALESCE PARTITION count

不能通过加大count值来增加分区的数量,否则会返回错误:Cannot remove all partitions, use DROP TABLE instead!。

增加分区,为新增count个分区,而不是增加到count个分区:

ALTER TABLE tablename

ADD PARTITION PARTITIONS count

MySQL按字符串hash分区_MySQL学习笔记(14):分区相关推荐

  1. mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数

    一.常见字符串函数:1.CHAR_LENGTH  获取长度(字符为单位) 2.FORMAT  格式化 3.INSERT  替换的方式插入 4.INSTR  获取位置 5.LEFT/RIGHT  取左. ...

  2. mysql select语句详解_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  3. mysql数据库select语句用法_mysql学习笔记之完整的select语句用法实例详解

    本文实例讲述了mysql学习笔记之完整的select语句用法.分享给大家供大家参考,具体如下: 本文内容: 完整语法 去重选项 字段别名 数据源 where group by having order ...

  4. mysql 拼接sql批量执行_Mysql 学习笔记之 SQL 执行过程

    写在开始 本系列源自极客时间 MySQL 专栏,整理而成 在执行下面这个查询语句时的执行的流程是怎么样的? mysql 看过相关资料的同学都可能知道执行流程大概是这样的: 其执行过程为:连接.查询缓存 ...

  5. mysql 存储引擎的选择_MySQL学习笔记(四):存储引擎的选择

    一:几种常用存储引擎汇总表 二:如何选择 一句话:除非需要InnoDB 不具备的特性,并且没有其他办法替代,否则都应该优先考虑InnoDB:或者,不需要InnoDB的特性,并且其他的引擎更加合适当前情 ...

  6. mysql模糊查询索引失效_MySql学习笔记(九):索引失效

    数据准备:CREATE TABLE `t_blog` ( `id` int(11) NOT NULL auto_increment, `title` varchar(50) default NULL, ...

  7. mysql对所有id求积_MySQL学习笔记(二)—查询

    一.多表连接查询 新建两张表t_user.t_order.       1.内连接 返回满足条件的所有记录. (1)显式内连接 使用inner join关键字,在on子句中设定连接条件. SELECT ...

  8. mysql入门很简单系列视频-学习笔记

    mysql入门很简单系列视频-学习笔记 视频链接:mysql入门很简单系列视频 https://www.bilibili.com/video/av14920200/ 以前主要就了解DDL.DML.DC ...

  9. 华为HCIA-datacom 学习笔记14——WLAN概述

    华为HCIA-datacom 学习笔记14--WLAN概述 1.WLAN(无线局域网) 通过无线技术构造的无线局域网络.WLAN广义上是指以无线电波.激光.红外线等无线信号代替有线局域网中的部分或全部 ...

最新文章

  1. python监听udp端口_python检测远程udp端口是否打开
  2. 45、Power Query-缺少功能区选项卡
  3. eclipse忘记了程序保存在哪里怎么办
  4. 安徽理工大学计算机学院蒋群,计算机学院2001级校友十周年聚会
  5. Spring定时器的运用
  6. 60页论文综述深度学习优化方法,出自UIUC
  7. js 中meta 移除head_JS函数和winform函数之间的相互调用
  8. 11 User Space, Kernel Space, and the System Call API(用户空间,核空间,系统api)
  9. 应用机器学习(一):聚类分析
  10. c++ string字符串翻转
  11. QCC3005 控制AMP_Mute的管脚配置问题
  12. 开启灯光就是近光吗_自动大灯会自动调远近光吗
  13. Scanf 用法和注意事项
  14. 黑盒测试---等价类划分
  15. 【先锋】永洪科技何春涛:不忘初心,砥砺前行
  16. 绿色版软件 tomcat+eclipse的使用
  17. android大图、高清图片处理
  18. 年度大促将至,企业如何进行性能压测
  19. 把steam上下载的GTA5转移到Epic中,免除Epic再次下载GTA5的方法
  20. 计算机二级access上机,计算机二级Access上机考点

热门文章

  1. python requests 代理ip_python requests 测试代理ip
  2. latex 子图_MATLAB学习笔记4:如何优雅地控制子图
  3. 在线社交媒体信息冗余现象建模与实证研究
  4. 作者:赵永恒(1964-),男,博士,中国科学院国家天文台研究员、博士生导师...
  5. 动态规划 NOIP经典问题 开心的金明(洛谷P1060题题解,Java语言描述)
  6. 【Java】日期字符串转换java.sql.Date对象
  7. Exchange Online基于网络位置限制使用
  8. AOS V0.8 发布,JavaEE 应用基础平台
  9. Struts2使用Interceptor实现权限控制的应用实例详解
  10. Linux的vi命令