mysqlpartition语法_MySQLpartition分区⼩结
MySQL partition分区
分区概念
分区针对不同的数据库,具有不同的特性。在这⾥专门针对MySQL数据库⽽⾔。在MySQL数据库⾥,分区这个概念是从mysql 5.1才开始提供的。不过⽬前只有在mysql advanced版本⾥才提供。
分区是把数据库、或它的组成部分(⽐如表)分成⼏个⼩部分。⽽且专门介绍的都是’⽔平分区’,即对表的⾏进⾏划分。
分区的优点
1.        可以提⾼数据库的性能;
2.        对⼤表(⾏较多)的维护更快、更容易,因为数据分布在不同的逻辑⽂件上;
3.        删除分区或它的数据是容易的,因为它不影响其他表。
注意:pruning,即截断。意思是说当你查询时,只扫描所需要查询的分区。。其他部分不会扫描。。这
就⼤⼤地提⾼了性能。
分区类型
分区具有如下4种类型:
Range分区:是对⼀个连续性的⾏值,按范围进⾏分区;⽐如:id⼩于100;id⼤于100⼩于200;
List分区:跟range分区类似,不过它存放的是⼀个离散值的集合。
Hash分区:对⽤户定义的表达式所返回的值来进⾏分区。可以写partitions (分区数⽬),或直接使⽤分区语句,⽐如partition p0 values in…..。
Key分区:与hash分区类似,只不过分区⽀持⼀列或多列,并且MySQL服务器⾃⾝提供hash函数。
具体描述:
分区语法:
create table t(id int,name varchar(20)) engine=myisam partition by range(id);
按range范围进⾏分区:
create table orders_range
(
id int auto_increment primary key,
customer_surname varchar (30),
store_id int,
mysql创建表数据类型salesperson_id int,
order_Date date,
note varchar(500)
) engine=myisam
partition by range(id)
(
partition p0 values less than(5),
partition p1 values less than(10),
partition p3 values less than(15)
);
其实上⾯的分区创建,我们可知道,它的表类型为myisam,⽽每个分区的引擎也是myisam,这个可以通过show create table tablename查看。当我们插⼊数据到表⾥时,如果要查看⼩于8的信息,它之后检索p0和p12个分区。这样就⾮常快速了。
按list进⾏分区:
create table orders_list
(
id int auto_increment,
customer_surname varchar(30),
store_id int,
salesperson_id int,
order_Date date,
note varchar(500),
index idx(id)
) engine=myisam partition by list(store_id)
(
partition p0 values in(1,3),
partition p1 values in2,4,6),
partition p3 values in(10)
);
list 分区只能把你插⼊的值放在某个已定的分区⾥,若没有那个值,,就显⽰不能插⼊。
按hash进⾏分区:
create table orders_hash
(
id int auto_increment primary key,
cutomer_surname varchar(30),
store_id int,
salesperon_id int,
order_date date,
note varcahr(500)
) engine=myisam partition by hash(id) partitions 4;
如果分为4个分区,那当我插⼊数据时,哪些数据是放在哪些分区⾥呢? 当我对某个id值进⾏检索时,它明确说放到哪个分区⾥?或者说是有什么内部机制?
使⽤hash分区,最主要就是确保数据的分配,它是基于create table时提供的表达式。不必定义单独的分区,只要使⽤partitions关键字和所需要分多少个区的数字。语句如上所述。
按key进⾏分区:
create table orders_key
(
id int auto_increment,
customer_surname varchar(30),
store_id int,
alesperson_id int,
order_Date date,
note varcahr(500),
index_idx(id)
) engine=myisam partition by key(order_date) partitions 4;
这个分区类似于hash分区,除了MySQL服务器使⽤它本⾝的hash表达式,不像其他类型的分区,不必要求使⽤⼀个int或null的表达式。
按⼦分区进⾏分区:
create table orders_range
(
id int auto_increment primary key,
customer_surname varchar(30),
store_id int,
salesperson_id int,
order_Date date,
note varchar(500)
) engine=myisam partition by range(id)
subpartition by hash(store_id) subpartitions 2
(
partition p0 values less than(5),
partition p1 values less than(10),
partition p3 values less than(15)
);
当把数据插⼊到表中时,那什么数据是放在⼦分区⾥呢?
================================================
MySQL partition分区II( 续)
获得分区信息
MySQL可以通过如下⽅式来获取分区表的信息:
Show create tabe table;      //表详细结构
show table status;    //表的各种参数状态
select * from information_schema.partitions;//通过数据字典来查看表的分区信息
explain partitions select * from table;  // 通过此语句来显⽰扫描哪些分区,及他们是如何使⽤的.
对分区进⾏修改 (修改、合并、重定义分区)
修改分区
修改部分分区:
由于我们平常使⽤的数据库⼤都是动态运⾏的,所以只对某个表分区进⾏修改就OK了。
可以对range或list表分区进⾏add或drop,也可以对hash或key分区表进⾏合并或分解。这些动作都在alter table语句⾥进⾏。使⽤add partition 关键字来对已有分区表进⾏添加。
Alter
table
orders_range
add
partition
(
Partition p5 values less than(maxvalue)
)
Reorganize partition关键字可以对表的部分分区或全部分区进⾏修改,并且不会丢失数据。
Splitting即分解⼀个已有分区:
Alter table orders_range
reorganize partition p0 into
(
partition n0 values less than(5000),
partition n1 values less than(10000)
);
Merge分区:像上⾯把p0分成n0和n1,现在在把2个合并为⼀个。
Alter table orders_range reorganize partition n0,n1 into
(
Partition p0 values less than(10000)
);
修改所有的分区:在into关键字之前或之后都指定多个分区
Alter table orders_range reorganize partition p0,p1,p2,p3,p4,p5 into
(
Partition r0 values less than(25000),
Partition r1 values less than(50000),
Partition r2 values less than(maxvalue)
);
Coalesce 合并分区:Merge分区的另⼀种⽅法就是alter table….coalesce partition语句,你不能对hash或key分区进⾏删除
Alter table orders_key coalesce partition1;
Redefine重定义分区
Alter table orders_range partition by hash(id) partitions 4;
对分区进⾏删除 (删除、删除所有分区)
Drop 分区:
可以对range或list类型的分区通过drop partition 关键字进⾏删除
Alter table orders_range drop partition p0;
注意:
1.对这个分区进⾏删除时,你会把这个分区的所有数据进⾏删除,与delete语句相等;
2.在做alter table..drop partition时,必须有drop权限;
3.运⾏这个删除命令,它不会返回删除了的⾏,可以通过select count()语句查看。
如果想对多个分区进⾏删除,可以使⽤如下命令语句:Alter table orders_range drop partition p1,p2;
删除所有分区
通过如下命令语句删除表中所有分区,最后是⼀个正规表.
Alter table orders_range remove partitioning;
当进⾏分区操作,了解对性能所产⽣的影响是⾮常有帮助的:
1.创建分区表⽐⽆分区的正规表要稍微慢些;
2.通过alter table….drop partition语句进⾏删除⽐delete语句要快些;
3.在range或list分区类型上添加分区(alter table…add partition语句)是相当快的,因为没有移动数据到新分区⾥。
4.当在⼀个key或hash类型的分区上执⾏alter table….add partition语句,要依赖表中已有多少⾏记录,数据越多,它添加⼀个新分区的时间就越长。当创建⼀个表时,使⽤线性hash或线性key分区是相当快的。
5.对成百上千的⾏记录,进⾏alter table …coalesce partition, alter table …reorganize partition, alter table…partition by操作命令时,是相当慢的。
6.当使⽤add partition命令时,线性hash和线性key分区会使coalesce partition操作更快, alter table …remove partitioning⽐其他都要快,因为mysql没有要求哪个⽂件来替代⾏,即使是移动数据。
各种存储引擎的分区
MySQL分区可以对所有MySQL⽀持的存储引擎进⾏分区,⽐如:myisam, innodb, archive, NDBcluster(只可以线性key),falcon, 不⽀持分区的引擎:merge, federated, csv, blackhole
注意:所有分区和⼦分区的表类型要⼀致;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。