博客
关于我
Mysql 表分区
阅读量:796 次
发布时间: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 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>