1.分区表的概念
mysql的分区表就是在物理层面把一张表分作多张子表存贮,在逻辑上是多张表对外部表现为同一张表。mysql的分区表对于用户来说是一个黑盒,用户可以像使用一般的表一样使用分区表,但是只有在对分区表足够了解的情况下,才能够正确的使用分区表,否则可能会带来一些性能上的问题。
2.分区表的适用场景
1.表的数据比较多,但一次只查一部分热点数据,比如按时间,或者按别的某种规则
2.分区表的索引是每个子表都会单独建一个索引,这点和oracle不同,oracle可以选择是否建立全局索引。根据键值进行分区可以减少innodb互斥量的竞争。
3.数据可以以较粗的粒度区分开,可以以分区的形式对数据进行管理。
3.分区表的限制
- 分区数最多只能有1024个分区
- 分区表达式必须是整数,或者返回整数的表达式。也可以使用列分区,例如 range,key,list都支持列分区。
- 如果表中有主键,或者唯一索引的话,分区键必须包含在主键和唯一索引中,否则会报错。
4.分区表的使用
mysql有hash,key,range,list分区,分区还可以包含子分区,子分区用的很少,这里不做介绍。
1.在可以在创建表时,通过partition by定义分区表,也可以通过alter语句,将表变为分区表,获取新增,合并,删除,拆分分区。
create部分定义如下,分区定义语句
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
........
partition_options:
PARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={
1|2}] (column_list)
| RANGE{
(expr) | COLUMNS(column_list)}
| LIST{
(expr) | COLUMNS(column_list)} }
[PARTITIONS num]
[SUBPARTITION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={
1|2}] (column_list) }
[SUBPARTITIONS num]
]
[(partition_definition [, partition_definition] ...)]
partition_definition:
PARTITION partition_name
[VALUES
{LESS THAN {
(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']