MySQL--RDS下的分区表实践
副标题[/!--empirenews.page--]
实践背景 项目中有的表空间太大,且行数太多,故决定对一些表进行分库分表。再研究选型方案的时候发现常用的一些分库分表的解决方案对业务代码修改较多,故决定采用MySQL的分区方案。 其实在我个人看来,分区表就是MySQL帮我们实现了底层的分库分表,不需要涉及业务代码的修改,不需要关注分布式事务。因为就访问数据库而言,逻辑上还是只有一个表,但是实际上确有多个物理分区对象组成,会根据具体的分区规则查询具体的分区。 介绍一下这次实践的表,表空间大小172G,1亿2千万条记录。 数据库版本:RDS MySQL 5.6 工具:阿里云DTS 一、为什么分区? 优点:
例如下面语句: SELECT * FROM t PARTITION(p0,p1)WHERE c <5 仅选择与WHERE条件匹配的分区p0和p1中的记录
缺点:
二、RANGE分区 目前MySQL支持范围分区(RANGE),列表分区(LIST),哈希分区(HASH)以及KEY分区四种。 本文是以范围分区(RANGE)对时间进行的分区的,故我就简单介绍一下RANGE分区。更多分区类型详见官方文档MySQL 5.6 分区类型 基于一个给定连续区间的列值,根据区间分配分区。最常见的是基于时间字段。其实基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。MySQL 5.6支持的分区函数 本例中使用TO_DAYS函数
PS:像例子中的如果你有主键或唯一索引,你必须把你的分区键也加上,其中joindate就是分区键,要不创建会失败! PS:像上面加了LESS THAN MAXVALUE,后面就不能新加分区了!!! 示例: 如下查询就会落在定义的p2分区内的索引上。故在查询的时候带上你的分区键就会走对应分区查询数据,如果你的条件跨越多个分区进行聚合函数SUM()、COUNT()的查询时,它会在每个分区上并行处理。如果没有带分区键查询就会全表查询。
我在迁移完数据进行查询的时候发现一个特别有意思的现象,同一条SQL如果分区键的时间区间不一样,它会根据rows行数少的走不同的范围索引。至于它底层是怎么实现的我就没去研究了 三、分区管理 简单介绍了下范围分区,接下来说一下对分区常用的一下操作。 分区管理包括对于分区的增加,删除,以及查询。更多详见官方文档MySQL 分区管理 1.增加分区 对于RANGE和LIST分区:
2.删除分区 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |