MySQL分区表介绍

作者: 十年磨一剑1111 | 来源:发表于2020-04-02 11:52 被阅读0次

    最近一直在复习MySQL分区表相关的知识,就简单整理下读书笔记。下面我们先来对mysql分区简单介绍下。

    分区的概述

    分区的过程是将一个表或索引分解为多个更小、更可管理的部分。从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成,每个分区都是独立的对象,可以独立处理,也可以作为一个更大对象的一部分进行处理。

    1. 支持分区的存储引擎有:InnoDB、MyISAM、NDB等。
    2. MySQL数据库支持的分区类型为水平分区,并不支持垂直分区。
    3. MySQL数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引,MySQL 不支持全局分区。
    4. 当前MySQL 数据库支持一下几种类型的分区:range分区、list 分区、hash分区、key分区。
    5. 不论是何种分区如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分。

    对于第4小点可能不是很好理解,下面笔者来做几个测试来帮助理解。
    (1) 表只包含唯一索引

    CREATE TABLE t1 (
    col1 INT NOT NULL,
    col2 DATE NOT NULL,
    col3 INT NOT NULL,
    col4 INT NOT NULL,
    UNIQUE KEY (col1,col2)
    )
    PARTITION BY HASH(col3)
    PARTITIONS 4;
    

    执行结果:A PRIMARY KEY must include all columns in the table's partitioning function
    分析: 由于不满足分区列必须是唯一索引的一个组成部分这一规则,因此报错。如果 改成 partition by hash(col1)或者partition by hash(col2) 又或者是 partition by hash(col1+col2) 都可以执行成功。

    (2) 表只包含主键索引

    CREATE TABLE t1 (
    col1 INT NOT NULL,
    col2 DATE NOT NULL,
    col3 INT NOT NULL,
    col4 INT NOT NULL,
    primary key (col1)
    )
    PARTITION BY HASH(col3)
    PARTITIONS 4;
    

    执行结果:A PRIMARY KEY must include all columns in the table's partitioning function
    分析 : 同样报错,原因同上。如果改成PARTITION BY HASH(col1) 则会执行成功

    (3) 既包含主键索引又包含唯一索引

    CREATE TABLE t1 (
    col1 INT NOT NULL,
    col2 DATE NOT NULL,
    col3 INT NOT NULL,
    col4 INT NOT NULL,
    primary key (col1),
    unique key (col3)
    )
    PARTITION BY HASH(col1+col3)
    PARTITIONS 4;
    

    执行结果:A PRIMARY KEY must include all columns in the table's partitioning function
    分析:报错,如果是上面这种情况,经测试表明:分区键必须是主键索引和唯一索引共同的那些字段,才能创建成功,所以以上这种情况必须修改索引包含的字段,否则会执行不成功。

    (4) 不包含主键,唯一索引,可以指定任何一个列为分区列

    CREATE TABLE t1 (
    col1 INT NOT NULL,
    col2 DATE NOT NULL,
    col3 INT NOT NULL,
    col4 INT NOT NULL,
    KEY (col1, col2)
    )
    PARTITION BY HASH(col3+col4)
    PARTITIONS 4;
    

    执行结果:Query OK, 0 rows affected (0.09 sec)
    分析: 由于不包含主键也不包含唯一索引,故对分区键没有特殊的要求,所以执行成功。
    上面就简单展示里几个例子,如果有不理解的地方,小伙伴们可以亲自测试下。

    水平分区:指将同一表中的不同行的记录分配到不同的物理文件中。
    垂直分区:指将同一个表中不同列的记录分配到不同的物理文件中。
    局部分区:一个分区既存放了数据又存放了索引。
    全局分区:数据存放在各个分区,但是所有数据的索引放在一个对象中。

    相关文章

      网友评论

        本文标题:MySQL分区表介绍

        本文链接:https://www.haomeiwen.com/subject/cpitphtx.html