MySQL分区摘要

MySQL支持的分区类型为水平分区,并不支持垂直分区。

水平分区,以行为单位,划分到不同的物理文件中;垂直分区即针对列划分。

MySQL的分区,除了InnoDB支持,MyISAM也支持,所以分区并不是引擎级别的事儿。

分区并不一定会让访问变得更快,尤其是OLTP应用,OLAP应用使用分区的效果往往更好。

MySQL支持的如下几种分区类型。

  • RANGE 行数据基于一个给定连续区间的列值划分。
  • LIST 和RANGE类似,只是LIST面向的不是连续区间值,而是离散的集合。
  • HASH 根据自定义的表达式返回值进行分区,不支持负数返回。
  • KEY 根据MySQL提供的hash函数进行分区

不论按照哪种类型进行分区,如果当前表有主键或者唯一索引,分区列必须是唯一索引的组成部分。反过来,如果当前表没有定义主键也没有唯一索引,分区列可以是任何列。



分区操作示例:

create table sales(id int, price decimal(9,2), season int, finyear datetime)
partition by range(season) (
prtition s1 values less than (4),
partition s2 values less than (7),
partition s3 values less than (10),
partition s4 values less than (13));

使用函数获取range值

create table sales(id int, price decimal(9,2), season int, finyear datetime)
partition by range(year(finyear)) (
partition s1 values less than (2016),
partition s2 values less than (2017),
partition s3 values less than (2018),
partition s4 values less than (2020));
create table sales(id int, price decimal(9,2), season int, finyear datetime)
partition by range(year(finyear)*100+ month(finyear)) (
partition s1 values less than (201804),
partition s2 values less than (201807),
partition s3 values less than (201810),
partition s4 values less than (201813));

LIST分区示例

create table sales(id int, price decimal(9,2), season int, finyear datetime)
partition by LIST(id) (
partition s1 values in (1,3,5,7,9),
partition s2 values in (2,4,6,8,10));

HASH分区示例

create table sales(id int, price decimal(9,2), season int, finyear datetime) engine=innodb
partition by hash(year(finyear));

KEY分区示例

create table sales(id int, price decimal(9,2), season int, finyear datetime) engine=innodb
partition by key(finyear);

分区后的数据存储结构及使用效果

以RANGE分区为例

插入数据

insert into sales select 1,10.05,1,‘2018-01-01‘;
insert into sales select 2,10.05,3,‘2018-03-01‘;
insert into sales select 3,10.05,4,‘2018-04-01‘;

执行查询

explain partitions
select * from sales where finyear < ‘2016-01-01‘;

可以看到,查询优化器,直接跳过第四个分区,在前三个分区中查询,这就是要的效果。

除了分区,还有分表、分库、分区操作,每一个都很重要,也都有各自的适用场景。

原文地址:http://blog.51cto.com/10705830/2162556

时间: 2024-11-11 15:20:39

MySQL分区摘要的相关文章

十四、mysql 分区之 HASH &amp;&amp; KEY

1.hash分区 PS::个人觉得HASH分区很好很强大,简单确分布极其均匀 创建实例: CREATE TABLE HASH_EMP ( tid int, tname char(255) ) PARTITION BY HASH (tid) PARTITIONS 8; 将hash_emp进行的tid进行hash分区,并分为8个区 查询分区的数据分布情况: select partition_name,partition_expression,partition_description,table_r

mysql分区及分表(二)

mysql分区分表(二) 测试未分区表和分区表性能 重新创建新的测试数据库及未分区表back1 创建分区表back2,按照年月区分 maxvalue把对于2005的值全放在p11区里 创建大点的数据(方便测试的时候区分明显分区和未分区的区别) rand()函数在0和1之间产生一个随机数,如果一个整数参数N指定,它被用作种子值..每个种子产生的随机数序列是不同的 执行存储过程load_part_tab向back2中插入数据 向back1中插入数据 测试未分区和分区的性能 可以通过explain语句

mysql分区技术

mysql分区技术在物理存储上使数据表进行分离,逻辑上还是一张表 mysql5.1以上版本有5种分区类型 RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择. HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算.这个函数可以包含MySQL 中有效的.产生非负整数值的任何表达式. KEY 分区:类似于按HASH分区

MySQL 分区知识点(三)

前言: MySQL 分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表, 从 information_schema.INNODB_SYS_TABLES 系统表可以看到每个分区都存在独立的 TABLE_ID: 由于 Innodb 数据和索引都是保存在 ".ibd" 文件当中(从INNODB_SYS_INDEXES 系统表中也可以得到每个索引都是对应各自的分区( primary key 和 unique 也不例外)), 所以分区表的索引也是随着各个分区单独存储.

Mysql 分区 分表相关总结之方案选择

[TOC] 引述 前段时间项目需要,一直在研究mysql sharding,看了一些这方面的资料,也亲自实验测试了一些数据.在此,做个概括的笔记,方便以后回顾知识,其实大多是借鉴网络上各位前辈的,然后抱着学习态度去实践,积累属于自己的东西. 拆分策略选择 其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里.有的是水平切分将数据量大的表按照一定逻辑进行拆分.个人感觉垂直切分的相对来说缓解了IO的瓶颈,而水平切分,目的是减轻了单个表或某些表读写的压力. 我们项目根据个

十三、mysql 分区之 RANGE &amp;&amp; LIST

1.RANGE 分区 创建实例: CREATE TABLE EMP ( id int not null primary key auto_increment, name char(25) not null default '' ) PARTITION BY RANGE (id) ( 将字段id定义为分区的字段 PARTITION P0 VALUES LESS THAN (100), 99以下的id都归到p0分区 PARTITION P1 VALUES LESS THAN (200), 100-1

mysql 分区 限制

MySQL分区的限制 ?   只能对数据表的整型列进行分区源码天空,或者数据列可以通过分区函数转化成整型列 ?   最大分区数目不能超过1024 ?   如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内 ?   不支持外键 ?   不支持全文索引(fulltext) 按日期进行分区很非常适合,因为很多日期函数可以用.但是对于字符串来说合适的分区函数不太多 mysql 分区 限制,布布扣,bubuko.com

十五、mysql 分区之 分区管理

1.mysql分区处理分区字段NULL值的方式 1.range分区null被当作最小值处理 2.list分区null值必须被枚举出来,否则将出错 3.hash/key分区 null值当作0处理 2.RANGE && LIST 分区管理 1.删除分区 alter table emp drop partition p0; //删除emp的p0分区,注意也会同时删除该分区的数据 2.增加分区 alter table emp add partition (partition p5 values l

mysql 分区

一.为什么要分区? 需求:大数据.解决方案:分而治之,更细一点即为.将大表和大索引分为一个更小的操作单元在mysql中,分区允许将表.索引和索引编排表细分为更小的单元.分区后,每个分区有自己单独的名称.对于DBA来讲,这些分区可以统一管理,也可以分开管理.但是对于应用程序来讲,分区的表和没有分区的表示一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理.Mysql分区,这个是mysql对于分区的官方解释. 1.分区的作用 a)提升性能 应该说,几乎所有分区的目的都是用来提升性能