博客
关于我
Mysql 表分区
阅读量:794 次
发布时间:2023-02-11

本文共 3253 字,大约阅读时间需要 10 分钟。

MySQL 分区简介

数据库分区是一种物理数据库设计技术,其主要目的是通过将数据分割成多个独立的物理存储单元来减少SQL操作的响应时间,同时为数据管理提供更高的效率。MySQL从5.1版本开始支持分区技术,分区完全透明于应用程序,应用无需做出任何修改即可享受分区带来的好处。

MySQL的分区主要有两种形式:水平分区和垂直分区。

MySQL 分区类型

根据分区规则的不同,MySQL分区可以分为以下几种类型:

  • RANGE 分区:基于一个给定区间的列值,将多行数据分配到不同的分区。常见于年份、日期等列。
  • LIST 分区:基于列值匹配一个离散值集合中的特定值进行选择。
  • HASH 分区:基于用户定义的表达式返回值进行选择,表达式必须能产生非负整数值。
  • KEY 分区:类似于HASH分区,但只能基于整数值列,MySQL提供内部哈希函数。
  • 复合分区:将RANGE/LIST类型的分区再次分割,子分区可以是HASH/KEY等类型。
  • MySQL 分区表常用操作示例

    以下是以部门员工表为例的分区操作示例:

  • 创建RANGE分区
  • create table emp (    empno varchar(20) not null,    empname varchar(20),    deptno int,    birthdate date not null,    salary int) partition by range(year(birthdate)) (    partition p1 values less than (1980),    partition p2 values less than (1990),    partition p3 values less than maxvalue);
    1. 创建LIST分区
    2. create table emp (    empno varchar(20) not null,    empname varchar(20),    deptno int,    birthdate date not null,    salary int) partition by list(deptno) (    partition p1 values in (10),    partition p2 values in (20),    partition p3 values in (30));
      1. 创建HASH分区
      2. create table emp (    empno varchar(20) not null,    empname varchar(20),    deptno int,    birthdate date not null,    salary int) partition by hash(year(birthdate)) partitions 4;
        1. 创建KEY分区
        2. create table emp (    empno varchar(20) not null,    empname varchar(20),    deptno int,    birthdate date not null,    salary int) partition by key(birthdate) partitions 4;
          1. 创建复合分区
          2. create table emp (    empno varchar(20) not null,    empname varchar(20),    deptno int,    birthdate date not null,    salary int) partition by range(salary) subpartition by hash(year(birthdate)) subpartitions 3 (    partition p1 values less than (2000),    partition p2 values less than maxvalue);

            分区表的管理操作

            分区表的管理操作包括:

            • 删除分区

              alter table emp drop partition p1;alter table emp drop partition p1, p2;
            • 增加分区

              alter table emp add partition (partition p3 values less than (4000));alter table emp add partition (partition p3 values in (40));
            • 分解分区

              alter table emp reorganize partition p1 into (    partition p1 values less than (100),    partition p3 values less than (1000));
            • 合并分区

              alter table emp reorganize partition p1, p3 into (    partition p1 values less than (1000));
            • 重新定义分区

              alter table emp partition by range(salary) partitions 7;
            • 删除所有分区

              alter table emp removepartitioning;
            • 重建分区

              alter table emp rebuild partition p1, p2;
            • 优化分区

              alter table emp optimize partition p1, p2;
            • 分析分区

              alter table emp analyze partition p1, p2;
            • 修补分区

              alter table emp repairpartition p1, p2;
            • 检查分区

              alter table emp check partition p1, p2;

            MySQL 分区表的局限性

          3. 在5.1版本中,分区表对唯一约束有明确规定,每个唯一约束必须包含在分区键中。
          4. 分区键所在列没有NOT NULL约束时,NULL值的处理方式取决于分区类型。
          5. 在HASH和KEY分区中,分区键不能是BLOB或TEXT类型。
          6. 只有RANGE和LIST分区支持子分区,HASH和KEY分区不支持子分区。
          7. 临时表不能被分区。
          8. 获取MySQL分区表信息的几种方法

          9. 使用show create table 表名查看创建分区表的语句。
          10. 使用show table status查看表是否为分区表。
          11. 使用information_schema.partitions查看分区信息。
          12. 使用explain partitions语句分析执行情况。
          13. 分区表性能比较

            通过存储过程插入800万条数据并进行查询测试可以看出,分区表的执行时间比普通表少70%。以下是测试结果:

            • 分区表查询

              select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

              返回结果为795181条数据,耗时2.62秒。

            • 普通表查询

              select count(*) from part_tab where c3 > date '1995-01-01' and c3 < date '1995-12-31';

              返回结果为795181条数据,耗时7.33秒。

            通过explain语句可以看到,分区表的查询仅扫描了7980796行数据,而普通表则扫描了8000206行数据,进一步证明了分区表的查询效率优势。

            参考资料

            本文内容参考自MySQL官方文档和相关技术博客,具体引用来源已去除。

    转载地址:http://ebbfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>