mysql分区的优点:

1、和单个磁盘或者文件系统分区相比,可以储存更多的数据。

2、优化查询,在where字句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率;同时在涉及sum()和count()这类聚合函数查询的时候,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果。

3、对于已过期或不需要保存的文件,可以通过删除与这些数据有关的分区来快速的删除数据。

4、跨多个磁盘分散数据查询,以获得更大的查询吞吐量。

mysql5.6以后的版本通过一下命令查询当前mysql是否支持分区。(该查询会显示所有插件,去查找partition插件对应的信息)

show plugins;

Mysql支持使用大部分存储引擎(比如 myisam,innodb,memory等存储引擎)创建分区表;Mysql不支持使用MERGE或是CSV存储引擎来创建分区表;同一个分区表的所有分区必须使用同一个存储引擎,不同的分区表可以使用不同的存储引擎。

mysql分区的类型:

1、range分区2、lsit分区3、hash分区4、key分区

5、colunms分区(5.5引入的分区类型)

注:mysql5.1开始支持分区的功能,5.1中range、list、hash分区都要求分区键都是int类型,也就是5.1仅仅支持整数分区。唯一例外的就是key分区,可以使用其他类型的列(blob或text列类型除外)作为分区键;5.5以上版本已支持非整数的range、list分区了

无论是那种分区,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键必须包含分区,也就是说不能使用主键/唯一键字段外的其他字段分区(分区字段必须是主键)

mysql命名是大小写敏感的,但是对于分区的命名大小写确是不敏感的。例如,创建分区时使用下面语句就会报错,因为它认为下面的分区名一致而导致分区名重复。

partition mypart values in (1,3,5),

partition MyPart values in (2,4,6)

一、range分区

create table temp(

idnot null,

enamevarchar(30),

jobvarchar(30),

store_idint not null)

partitionbyrange (store_id) (

partition p0values less than (10),

partition p1values less than (20),

partition p2values less than (30)

);

上述DDL语句中,如果将id作为主键来创建表的话,那么就会报错: a primary key must include all columns in the table's partitioning function。(这是问题针对对所有分区类型);

按照这个分区方案,当store_id大于等于30的时候,数据就会插入失败,因为mysql不知道该把数据插入到哪个磁盘分区下。

这个时候就需要用到下面语句

alter table temp addpartition (

partition p3valuesless than maxvalue

);

range分区中,分区键如果是null值就会被当做一个最小值来处理。

非整数分区,5.5后支持,提供了range columns 分区来支持非整数分区,例如字段中有一些字段类型创建日期create_time,这样创建日期时候就不需要通过函数进行转换。

partition byrange columns (create_time) (

partition p0values less than ('19940813'),

partition p1values less than ('20120101'),

partition p2values less than ('20180101')

);

日期处理的函数还有year(),to_days(),to_seconds()--把日期转化成秒。

删除分区:

alter table temp drop partition p0; #删除p0分区的数据

经常运用分区查询,可以很快的确定只有某一个或某些分区需要扫描,例如检索商店id大于25的记录,只需要扫描p2分区即可。

explain partition select count(1) from temp where store_id>=25;

二、list分区

list分区建立在离散的值列告诉数据库指定的值属于哪个分区,list分区在很多方面类似range分区

create tableexpenses(

expenses_date datenot null,

categoryint,

amountdecimal (10,3)

)

partitionbylist(category)(

partition p0values in (3,5),

partition p1values in (1,10),

partition p2values in (4,9),

partition p3values in (2)

);

5.5后支持非整数分区

create tableexpenses(

expense_date datenot null,

categoryvarchar(30),

amountdecimal (10,3)

)

partitionbylist columns (category) (

partition p0values in ('lodging','food'),

partition p1values in ('flights','ground transportation'),

partition p2values in ('leisure','customer entertainment')

);

三、columns分区

columns是在mysql5.5引入的分区类型,是为了解决mysql5.5版本之前只支持非整型分区,从而需要通过额外的函数计算得到整型或者通过额外的转换表来转换为整数在分区的问题。columns可以细分为range columns分区和list columns分区。range columns和list columns分区都支持整数、日期时间、字符串三大类型数据。

1、所有整数类型:tinyint 、smallint、mediumint、int和bigint;其他数值类型都不支持,例如不支持decimal和float;2、日期时间类型:date和datetime;3、字符类型:char、varchar、binary和varbinary;不支持text和blob类型作为分区键;

columns分区的亮点除了支持数据类型增加以外,另外一大亮点就是columns分区还支持多列分区。

create tablerc3(

aint,

bint)

partitionbyrange columns(a,b) (

partition p01values less than (0,10),

partition p02values less than (10,10),

partition p03values less than (10,20),

partition p04values less than (10,35),

partition p05values less than (10,maxvalue),

partition p06valuesless than (maxvalue,maxvalue)

);

四、hash分区

hash分区主要是用分散热点读,确保数据在预算确定个数的分区中尽可能平均分布,mysql支持两种分区,常规HASH分区、线性HASH分区(LINEAR HASH分区);常规hash使用的是取模算法。线性hash分区使用的是一个线性的2的幂的运算法则。

下面创建一个常规hash分区的散列表emp,使用partition by partitions hash(expr) partitions num,对分区类型、分区键和分区个数进行定义。其中expr是某列值或一个基于某列值返回的一个整数值的表达式,num是一个非负的整数,标识分隔成分区的数量,某人num为1。

下面创建一个基于store_id列hash分区的表,表被分成了4个分区。

create tableemp (

idint not null,

enamevarchar(30),

hired datenot null default '1970-01-01',

separated datenot null default '9999-12-31',

jobvarchar(30) not null,

store_idint not null)

partitionby hash (store_id) partitions 4;

对于一个表达式expr,我们可以计算出它将会保存到那个分区。将要保存的分区编号为N,N=MOD(expr,num)。所以下面记录中我们可以发现将会保存到那个分区中

insert into emp values (1,'tom','2010-10-10','9999-12-31','cleck',234);

根据上面的公示就可以发现N=MOD(234,4)#取模,求余#,结果为2。所以被分配到第二分区。

'expr'可以是mysql中有效的任何函数或其他表达式,只要他们返回一个即非常也非随机数的整数。只是每当插入/更新/删除一行数据时,这个表达式都需要运算一次,这就意味着非常复杂的表达式可能会引起性能问题。mysql也不推荐使用涉及多列的哈希表达式。

常规的hash分区的方式通过取模的方式使数据尽可能分配到每个分区中,让每个分区中的数据都减少,从而提高查询的效率;可能当我们需要新增分区或者合并分区的时候,问题就会出现了。假设原来是5个常规分区,现在新增为6个。取模算法由原来的mod(exp,5)变成了mod(exp,6)。原来5个分区中的数据大部分需要从新通过从新计算从新分区。所以常规的hash分区在分区管理上带来的代价太大了,不适合需要灵活变动分区的需求。

所以为了降低管理分区上的代价,mysql提供了线性分区,分区函数是一个线性的2的幕运算。

线性hash分区和常规hash分区在语法上唯一的区别就是在partition by 字句中添加 linear 关键字,例如:

create tableemp (

idint not null,

enamevarchar(30),

hired datenot null default '1970-01-01',

separated datenot null default '9999-12-31',

jobvarchar(30) not null,

store_idint not null)

partitionby linear hash (store_id) partitions 4;

线性hash分区的优点是,在分区维护(包含新增、删除、合并、拆分分区)时,mysql能够处理得更加迅速;缺点是,对比常规hash分区(取模)的时候,线性hash各个分区之间数据的分布不太平衡。

五、key分区

4,key分区

key分区和hash分区的区别:

1)hash分区允许用户自定义的表达式,而key分区不允许使用用户自定义的表达式。

2)hash分区只支持整数分区,key分区支持除了blob或text类型之外的其他数据类型分区。

3)与hash分区不同,创建key分区表的时候,可以不指定分区键,默认会选择使用主键/唯一键作为分区键,没有主键/唯一键,必须指定分区键。

在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法

CREATE TABLEemployees (

idINT NOT NULL,

first_nameVARCHAR(30),

last_nameVARCHAR(30),

store_idINT NOT NULL,

emailVARCHAR(30) NOT NULL,

create_time DATENOT NULL DEFAULT '9999-12-31',

)

PARTITIONBY LINEAR Key(email) PARTITIONS 4;

mysql非整型分区_mysql分区相关推荐

  1. mysql 字符串类型 分区_MySQL分区类型

    博文大纲: 1.RANGE分区 2.LIST分区 3.HASH分区 4.key分区 5.MySQL分表和分区的区别 6.附加:如何实现将分区放在不同的目录下进行存储 MySQL分区类型如下: RANF ...

  2. mysql如何进行分区_mysql如何进行分区_mysql分区有哪些方法

    MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,MySQL 在 PHP 的 web 开发中是应用最广泛.大家知道mysql如何分区的吗?下面由学习 ...

  3. mysql约束条件整型_MySQL 数据类型(整型,浮点型,字符类型,日期类型,枚举和集合) 约束条件 自增...

    存储引擎补充: 不同的应用软件处理不同类型的数据 MySQL5.5版本及以上默认的存储引擎为innodb innodb:支持行锁表锁,外键,事物,安全性更高,教myisam数据更安全 myisam:仅 ...

  4. mysql约束条件整型_MySQL 表的操作

    表的操作 创建表的完整语法: create table 表名( 字段名1 字段类型[(宽度) 约束条件], 字段名1 字段类型[(宽度) 约束条件], 字段名1 字段类型[(宽度) 约束条件] ); ...

  5. mysql是否truncate分区_MySQL分区管理

    以下是我看MySQL官方文档的时候整理的笔记,仅作参考保留. RANGE,LIST分区管理 1:为未分区表创建分区 ALTER TABLE trb3 PARTITION BY KEY(id) PART ...

  6. mysql 短整型_C++ int,short,long(详解版)

    C++ 有许多不同类型的数据.变量根据其数据类型进行分类,并确定可能存储在其中的信息种类.在这些数据类型中,整型变量只能保存整数. 计算机程序从现实世界收集数据,并以各种方式操作它们.有许多不同类型的 ...

  7. MySQL按字符串hash分区_Mysql分区

    Myisam:多个小表一个聚合表,逻辑上的 Innodb:物理文件的划分 注意事项 Show plugins Show engines Show variables like '%partition% ...

  8. mysql 取模分区_MySQL分区

    分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它.而分区是将数据分段划分在多个位置存放,分区后,表面上还是一张表,但 ...

  9. mysql 非自然月统计_MySQL性能优化 — 实践篇1

    点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 MySQL索引底层数据结构与算 ...

  10. mysql非聚簇索引查询过程_MySQL的聚簇索引、非聚簇索引及其查询解析方法

    1.聚簇索引和非聚簇索引 索引是用来提高数据库性能的,用于快速找出某个列中有一特定值的行,如果不使用索引,MySQL必须从第1条记录开始读完整个表直到找出相关的行,表越大,花费的时间越多,如果表中查询 ...

最新文章

  1. sqoop 数据迁移
  2. 面试:如何实现 MySQL 删除重复记录并且只保留一条
  3. MySQ软件的卸载-通过控制面板方式
  4. when is Lessifier triggered to be loaded
  5. hibernate实现多变联合查询
  6. C++socket编程(五):5.2 tcp编程总结
  7. bcp入库oracle,Sybase中的BCP用法实践 与 Oracle的SQLLDR用法实践
  8. 【Unity3D应用案例系列】Unity3D中实现《3D照片墙》
  9. 各大市场应用上架整理
  10. YankNote 笔记软件比 Sublime 好用吗
  11. android 从app跳转到微信小程序和微信没有设置浮动权限 打不开小程序
  12. AIX平台安装python
  13. oracle tns 启动失败,Oracle 监听启动失败 TNS-12555: TNS:permission denied 解决方案
  14. 服务器摆放需要预留U位么_办公沙发摆放有何讲究?
  15. Unity3D射击类游戏制作第三节--游戏模型
  16. 马化腾:我和太太也是QQ认识的
  17. sql中完全依赖,部分依赖,传递依赖关系
  18. 4.11 数值分析: 求重根/带参数m的牛顿迭代法
  19. malloc函数java_malloc函数具体解释
  20. 共享了磁盘,但是提示没有权限访问

热门文章

  1. C++ 线程安全的单例模式总结
  2. 项目管理全景沙盘演练经验分享(内附项目管理软件分析)
  3. element tree不刷新视图_安卓从入门到进阶第五章(视图查看)
  4. 华硕 PRIME H410M-K + i5-10400F 黑苹果 EFI文件
  5. 「面试必背」Linux面试题(2022最新版)
  6. 代码走查和代码审查_代码审查是个好主意的其他原因
  7. 模拟钟表的手机软件_手机时钟软件推荐
  8. python恶搞图_Python恶搞代码
  9. 零碎技术栈01_UML画图分析
  10. 计算机科学梦想演讲稿,关于科技演讲稿讲话稿范文三篇