Fork me on GitHub

MySQL的分区

1. 什么是表分区?

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

2. 表分区与分表的区别

分表:指的是通过一定规则,将一张表分解成多张不同的表。比如将用户订单记录根据时间成多个表。
分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表。

3. 表分区有什么好处?

  • 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。
  • 和单个磁盘或者文件系统相比,可以存储更多数据。
  • 优化查询。在where语句中包含分区条件时,可以只扫描一个或多个分区表来提高查询效率;涉及sum和count语句时,也可以在多个分区上并行处理,最后汇总结果。
  • 分区表更容易维护。例如:想批量删除大量数据可以清除整个分区。
  • 可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。

4. MySQL支持的分区类型有哪些?

  • RANGE分区:按照数据的区间范围分区
  • LIST分区:按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。
  • HASH分区
  • KEY分区

    A、 HASH分区

    根据$MOD$(分区键)的值,把数据行存储到表的不同分区中,键值必须为INT类型的值,或者转换为INT类型进行HASH函数运算。
    1
    2
    CREATE TABLE `order` (***)
    PARTITION BY HASH(order_id) PARTITIONS 4;

B、RANGE分区

根据分区表键值的范围把数据行存储到表的不同分区中,默认情况下使用VALUES LESS THAN属性,也即[0,100)。

适用分区键为日期或者时间类型,数据分布均衡,容易归档。

1
2
3
4
5
6
7
CREATE TABLE `order` (***)
PARTITION BY RANGE(product_id) (
PARTITION p0 VALUES LESS THAN (1000),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN (3000),
PARTITION p3 VALUES LESS THAN MAXVALUE
);

注意:

  1. 每个分区都是按顺序定义的,从最低到最高。
  2. 当插入的记录中对应的分区键的值不在分区定义的范围中的时候,插入语句会失败。
  3. Range分区中,分区键的值如果是NULL,将被作为一个最小值来处理。

C、LIST分区

按分区键取值的列表进行分区,每一行数据须找到对的分区列表,否则数据插入失败。

1
2
3
4
5
CREATE TABLE `order` (***)
PARTITION BY LIST(partner_id) (
PARTITION p0 VALUES IN (1,3,5,7,9),
PARTITION p1 VALUES IN (2,4,6,8,10)
);

注意:

MYSQL的分区字段,必须包含在主键字段内
如果有主键,那么分区字段必须是主键(之一);如果没有主键,则可以指定任意字段作为分区字段。

支持一下^-^
0%