mysql 分区

一、为什么要分区?

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

1.分区的作用

a)提升性能

应该说,几乎所有分区的目的都是用来提升性能的。不是谁哪天早上吃着鸡蛋灌饼,说咱们分个区玩玩吧!不是的。
那么分区是如何来提升检索数据的性能的呢?没
有分区之前,数据每次在查询和检索总是面向的是整个数据库和表。分区之后,mysql针对每个分区生成特定的数据文件与索引文件。每次只会检索特定的部分
数据,因此可以更好的来执行和维护数据库。究其原因还是因为在分区之后表指派到不同的物理驱动器上,这样便可在同时访问多个分区时减少物理 I/O
争用。
b)易于管理
对于一些无用的冗余的历史数据来讲,可以根据分区之后直接删除相应的分区。操作起来更加简便,因为执行数以万计的数据远比直接删除文件来的困难的多、时间也更加的长。
c)容错
分区之后相比分区之前,一张表从之前一个文件分为现在的三个文件。分区之后即使一个文件出现破坏,也不会影响其他数据。
2..常用分区方法

RANGE分区
LIST分区
HASH分区
KEY分区

二、如何分区?

1.查看数据库是否支持分区


1

SHOW VARIABLES LIKE ‘%partition%‘;

对于mysql来讲,现阶段支持分区操作的版本有5.1和5.5.如图显示为YES则表明该数据库支持分区操作。

2.四种常见分区

Range分区

俗称:范围分区。根据表的字段的值,依据给定某段连续的区间来分区。

直接创建表时分区


1

2

3

4

5

6

7

8

9

10

11

12

13

create table teacher

(id varchar(20) not null ,

name varchar(20),

age varchar(20),

birthdate date not null,

salary int

)

partition by range(year(birthdate))

(

partition p1 values less than (1970),

partition p2 values less than (1990),

partition p3 values less than maxvalue

);

Ps:创建teacher表,并在创建teacher表同时根据birthdate字段将表划分为p1、p2、p3三个分区。

在创建表后分区


1

2

3

4

5

6

7

ALTER TABLE teacher

partition by range(year(birthdate))

(

partition p1 values less than (1970),

partition p2 values less than (1990),

partition p3 values less than maxvalue

);

Ps:给已经创建了的表分区,分为p1、p2、p3.

LIST分区

俗名:列表分区。其实list分区和range分区应该说都是一样的,不同的是range分区在分区是的依据是一段连续的区间;而list分区针对的分区依据是一组分布的散列值。


1

2

3

4

5

6

7

8

9

10

11

12

create table student

 (id varchar(20) not null ,

 studentno int(20) not null,

 name varchar(20),

 age varchar(20)

 )

 partition by list(studentno)

 (

 partition p1 values in (1,2,3,4),

 partition p2 values in  (5,6,7,8),

 partition p3 values in (9,10,11)

 );

Ps:如上创建表student,并将student表分为p1、p2、p3三个分区。需要注意的是一般情况下,针对表的分区字段为int等数值类型。

HASH分区

小名:哈希分区。哈希分区主要是依据表的某个字段以及指定分区的数量。


1

2

3

4

5

6

7

create table user (

  id int(20) not null,

  role varchar(20) not null,

  description varchar(50)

)

partition by hash(id)

partitions 10;

Ps:如上创建user表,并将user表平均分为十个分区。比较有限制的就是需要知道表的数据有多少才能更好平均分配分区。

key分区

类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。


1

2

3

create table role( id int(20) not null,name varchar(20) not null)

partition by linear key(id)

partitions 10;

3.分区表管理

对指定表添加分区


1

alter table user add partition(partition p4 values less than MAXVALUE);

删除指定表指定分区

alter table student drop partition p1;

创建子分区


1

2

3

4

5

6

7

8

create table role_subp(id int(20) not null,name int(20) not null)

partition by list(id)

subpartition by hash(name)

subpartitions 3

(

  partition p1 values in(10),

  partition p2 values in(20)

)

复合分区

?


1

2

3

alter table user

reorganize partition p1,p3 into

(partition p1 values less than (1000));

时间: 2024-08-07 03:26:10

mysql 分区的相关文章

十四、mysql 分区之 HASH && 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 && 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)提升性能 应该说,几乎所有分区的目的都是用来提升性能