MySQL分区表使用总结

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 我们经常遇到一张表里面保存了上亿甚至过十亿的记录,这些表里面保存了大量的历史记录。 对于这些历史数据的清理是一个非常头疼事情,特定场景下分区表可以很好的解决,但分区又有哪些坑或注意事项呢?

MySQL分区表概述

我们经常遇到一张表里面保存了上亿甚至过十亿的记录,这些表里面保存了大量的历史记录。 对于这些历史数据的清理是一个非常头疼事情,由于所有的数据都一个普通的表里。所以只能是启用一个或多个带where条件的delete语句去删除(一般where条件是时间)。 这对数据库的造成了很大压力。即使我们把这些删除了,但底层的数据文件并没有变小。面对这类问题,最有效的方法就是在使用分区表。最常见的分区方法就是按照时间进行分区。 分区一个最大的优点就是可以非常高效的进行历史数据的清理。

分区类型

目前MySQL支持范围分区(RANGE),列表分区(LIST),哈希分区(HASH)以及KEY分区四种。

分区适用场景和优势

表数据量非常大而且大部分为历史数据,不经常被访问;
简单的业务场景,不会产生跨分区查询或跨分区关联;
分区表数据更容易维护(可独立对分区进行优化、检查、修复及批量删除大数据可以采用drop分区的形式等);
分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备;
分区表可以避免某些特殊的瓶颈(ps: InnoDB的单个索引的互斥访问、ext3文件系统的inode锁竞争等);
可以备份和恢复独立的分区,非常适用于大数据集的场景;

分区表限制

按照时间戳range分区只支持increasing规则;
drop分区后数据会全部被清空,不会做数据迁移;
分区字段必须包含在主键字段内,唯一键必须包含在分区字段;
分区字段不支持timestamps类型,需要使用datetime;
单表最多支持1024个分区;
分区表无法使用外键约束;
分区必须使用相同的Engine;
对于MyISAM分区表,不能在使用LOAD INDEX INTO CACHE操作;
对于MyISAM分区表,使用时会打开更多的文件描述符(单个分区是一个独立的文件);
分区键最好默认设置为NOT NULL
分区表不支持除了主键外的唯一键

Oracle分区表的坑

oracle分区表删除后会导致索引失效,查询计划变化性能很差

自动创建分区表

-- 按日期格式自动添加分区存储过程
CREATE PROCEDURE `pro_sys_logByWeekDay`(IN tableName VARCHAR(50),IN timeColName VARCHAR(50),IN DateFormat VARCHAR(10) )
    COMMENT '按日期格式(年YEAR,月month,周week,日day)添加表分区的存储过程,由定时任务调用'
BEGIN
    DECLARE p_id int;
    DECLARE lasttime VARCHAR(20);
    DECLARE nexttime varchar(20);
   
    SELECT COUNT(partition_name),max(partition_description) des into p_id,lasttime
    from INFORMATION_SCHEMA.partitions WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME=tableName;
   
    set @v_add_a=CONCAT('select adddate(str_to_date(',lasttime,',\'%Y%c%d\'),Interval 1 ',DateFormat,') into @nexttime from dual ');
    -- select @v_add_a;
    PREPARE stm from @v_add_a;
    EXECUTE stm;
    DEALLOCATE PREPARE stm;
   
    set nexttime=@nexttime;
    set @v_add=CONCAT('alter table ',tableName,' add partition (partition ',CONCAT('par',p_id),' values less than (\'',replace(nexttime,'-',''),'\'))');
    -- select @v_add;
    PREPARE stmt from @v_add;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END
-- 创建每周生成一次表分区的定时任务
create EVENT event_sysLogWeek on SCHEDULE EVERY 1 WEEK STARTS CURRENT_TIMESTAMP
on COMPLETION PRESERVE
ENABLE
DO call  pro_sys_logByWeekDay('dispatcher_send_msg_par','SENDDATE','Week');
-- 创建每天生成一次表分区的定时任务
create EVENT event_sysLogDay on SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP
on COMPLETION PRESERVE
ENABLE
DO call  pro_sys_logByWeekDay('dispatcher_send_msg_par','SENDDATE','day');

总结

分区表看上去很帅气,但使用上存在约束,分区键设计不太灵活,如果不走分区键很容易出现全表锁,适用于简单的大数据量业务场景,复杂的大数据量场景可以考虑分表分库水平扩展方案。

参考

MySQL最佳实践分区表基本类型 : http://mysql.taobao.org/monthly/2017/11/09/
MySQL存储过程按月创建表分区: https://blog.csdn.net/aofavx/article/details/50378360
分区表不建议创建主键的原因 https://yq.aliyun.com/articles/48791
MySQL 表分区操作错误1503解决方案http://google3030.blog.163.com/blog/static/16172446520103591023745/

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
监控 负载均衡 关系型数据库
MySQL技能完整学习列表13、MySQL高级特性——1、分区表(Partitioning)——2、复制(Replication)——3、集群(Clustering)
MySQL技能完整学习列表13、MySQL高级特性——1、分区表(Partitioning)——2、复制(Replication)——3、集群(Clustering)
51 0
|
9月前
|
传感器 关系型数据库 MySQL
php语句:MySQL指定分区表跨分区根据时间条件快速查询记录的封装函数
php语句:MySQL指定分区表跨分区根据时间条件快速查询记录的封装函数
96 0
|
6月前
|
存储 关系型数据库 MySQL
MySQL分区表详解
在我们日常处理海量数据的过程中,如何有效管理和优化数据库一直是一个既重要又具有挑战性的问题
51 0
|
8月前
|
存储 关系型数据库 MySQL
【MySQL】MySQL分区表详解
【MySQL】MySQL分区表详解
171 0
|
9月前
|
存储 SQL 运维
PolarDB MySQL大表实践-分区表篇
背景:分区表到底是什么?分区作为传统企业级数据库的特性,早已经在很多大数据和数仓场景中得到广泛应用。基于维基百科的解释,分区是将逻辑数据库或其组成元素如表、表空间等划分为不同的独立部分。数据库分区通常是出于可管理性、性能或可用性的原因,或者是为了负载平衡。它在分布式数据库管理系统中很流行,其中每个分区可能分布在多个节点上,节点上的用户在分区上执行本地事务。这提高了具有涉及某些数据视图的常规事务的站
332 0
PolarDB MySQL大表实践-分区表篇
|
10月前
|
存储 关系型数据库 MySQL
高性能 MySQL(十二):分区表
分区表是一个独立的逻辑表,其底层由多个物理子表组成。对分区表的请求,在 MySQL 底层都会被转换为对范围内的物理子表的请求,并将结果合并到一起返回。
94 0
|
存储 SQL 缓存
【MySQL高级】查询缓存、合并表、分区表
【MySQL高级】查询缓存、合并表、分区表
175 0
【MySQL高级】查询缓存、合并表、分区表
|
存储 算法 关系型数据库
Mysql 分区表基本操作和注意事项
Mysql分区优势 1、存储更多的数据 2、优化查询 3、并行处理 4、快速删除数据 5、更大的数据吞吐量
267 0
|
SQL 关系型数据库 MySQL
mysql中lock tables与unlock tables(锁表/解锁)使用总结
mysql中lock tables与unlock tables(锁表/解锁)使用总结
279 0
|
SQL 存储 Oracle
MySQL总结
一.SQL语句简介 1.什么是SQL? SQL(Structured Query Language):结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”
MySQL总结