博客
关于我
Mysql 表分区
阅读量:793 次
发布时间: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 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询数据库所有表的字段信息
    查看>>
    【Java基础】什么是面向对象?
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>
    mysql 死锁(先delete 后insert)日志分析
    查看>>
    MySQL 死锁了,怎么办?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 深度分页性能急剧下降,该如何优化?
    查看>>
    MySQL 添加列,修改列,删除列
    查看>>
    mysql 添加索引
    查看>>