分区
就访问数据库的应用而言,逻辑上只有一个表或一个索引,但是实际上这个表可能由数10个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理,可以作为表的一部分进行处理。
分区对应用来说是完全透明的,不影响应用的业务逻辑
创建分区,是对数据表,和索引表,同时创建分区的。
不能分别创建分区;同时也不能对部分数据进行分区;
分区在创建完成之后,管理员也无法动态更改;
mysql分区的优点主要包括:
和单个磁盘或者文件系统分区相比,可以存储更多数据
优化查询。在where子句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率。
对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
跨多个磁盘来分散数据查询,以获得更大的查询吞吐量
分区键:partition key
查看是否支持分区:
mysql> show variables like '%partition%';+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
分区类型
range分区:基于一个给定连续区间范围,把数据分配到不同的分区。
list分区:类似range分区,区别在于list分区是基于枚举的值列表分区,range是基于给定的连续区间范围分区
hash分区:基于给定的分区个数,把数据分配到不同的分区
key分区:类似与hash分区
5.1 版本range,list,hash,分区键,必须是int,或者表达式返回int类型;
5.5 版本 的range,list分区,已经支持非整数分区了;
key分区,可以使用除blob,text之外的类型列作为分区键;
如果存在主键/唯一键字段,则不能使用除主键/唯一键字段之外的其他字段进行分区。
range分区:
利用取值范围将数据分成分区,区间要连续并且不能相互重叠;
使用values less than 操作符按照进行分区定义:
注意:分区只能在建表的时候进行,建完表之后,只能增加分区内容;
PARTITION BY RANGE (store_id)
( PARTITION p0 VALUES LESS THAN (10) )
mysql> show create tableemp;| emp | CREATE TABLE`emp` (
`id`int(11) NOT NULL,
`store_id`int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1/*!50100 P