MySQL--RDS下的分区表实践
实践背景
项目中有的表空间太大,且行数太多,故决定对一些表进行分库分表。再研究选型方案的时候发现常用的一些分库分表的解决方案对业务代码修改较多,故决定采用MySQL的分区方案。
其实在我个人看来,分区表就是MySQL帮我们实现了底层的分库分表,不需要涉及业务代码的修改,不需要关注分布式事务。因为就访问数据库而言,逻辑上还是只有一个表,但是实际上确有多个物理分区对象组成,会根据具体的分区规则查询具体的分区。
介绍一下这次实践的表,表空间大小172G,1亿2千万条记录。
数据库版本:RDS MySQL 5.6
工具:阿里云DTS
一、为什么分区?
优点:
对已过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据,它的效率远比DELETE高
在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率
例如下面语句:
SELECT * FROM t PARTITION(p0,p1)WHERE c <5 仅选择与WHERE条件匹配的分区p0和p1中的记录
涉及聚合函数SUM()、COUNT()的查询时,会在每个分区上并行处理
分区把原本一个表的数据存储在多个物理磁盘上,实现了更高的IOPS
缺点:
无法使用外键,不支持全文索引(现在应该也没什么公司还在用外键吧)
分区键设计不太灵活,如果不走分区键,很容易出现全表锁
开发写一个SQL,不清楚mysql是怎么玩的
二、RANGE分区
目前MySQL支持范围分区(RANGE),列表分区(LIST),哈希分区(HASH)以及KEY分区四种。
本文是以范围分区(RANGE)对时间进行的分区的,故我就简单介绍一下RANGE分区。更多分区类型详见官方文档MySQL 5.6 分区类型
基于一个给定连续区间的列值,根据区间分配分区。最常见的是基于时间字段。其实基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。MySQL 5.6支持的分区函数
本例中使用TO_DAYS函数
CREATE TABLE members (
id VARCHAR(25) NOT NULL,
firstname VARCHAR(25) NOT NULL,
lastname VARCHAR(25) NOT NULL,
username VARCHAR(16) NOT NULL,
email VARCHAR(35),
joindate DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id,joindate) USING BTREE,
KEY idx_joindate (joindate) USING BTREE
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT
PARTITION BY RANGE (TO_DAYS(joindate)) (
PARTITION p0 VALUES LESS THAN (TO_DAYS('1960-01-01')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('1970-01-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('1980-01-01')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('1990-01-01')),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
PS:像例子中的如果你有主键或唯一索引,你必须把你的分区键也加上,其中joindate就是分区键,要不创建会失败!
PS:像上面加了LESS THAN MAXVALUE,后面就不能新加分区了!!!
示例:
如下查询就会落在定义的p2分区内的索引上。故在查询的时候带上你的分区键就会走对应分区查询数据,如果你的条件跨越多个分区进行聚合函数SUM()、COUNT()的查询时,它会在每个分区上并行处理。如果没有带分区键查询就会全表查询。
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="3" SnapsToDevicePixels="true">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ExpansionStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.3">
<VisualTransition.GeneratedEasingFunction>
<QuarticEase EasingMode="EaseOut"/>
</VisualTransition.GeneratedEasingFunction>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="Expanded"/>
<VisualState x:Name="Collapsed">
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="ExpandableContentControl">
<EasingDoubleKeyFrame KeyTime="www.chenghylpt.com" Value="0"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Percentage" Storyboard.TargetName="ExpandableContentControl">
<EasingDoubleKeyFrame KeyTime="www.renheyL.com" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<DockPanel>
<ToggleButton x:Name="HeaderSite" ContentTemplate="{TemplateBinding HeaderTemplate}" ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}" Content="{TemplateBinding Header}" DockPanel.Dock="Top" Foreground="{TemplateBinding Foreground}" FontWeight="{TemplateBinding FontWeight}" FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" FontStyle="{TemplateBinding FontStyle}" FontStretch="{TemplateBinding FontStretch}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" HorizontalContentAlignment=www.feironggw.cn"{TemplateBinding HorizontalContentAlignment}" IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}www.ztylegw.cn" Margin="1" MinWidth="0" MinHeight="0" Padding="{TemplateBinding Padding}" Style="{StaticResource ExpanderDownHeaderStyle}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
<Primitives:ExpandableContentControl x:Name="ExpandableContentControl" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"www.yifa5yl.com VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="{TemplateBinding Padding}" ClipToBounds="True"www.zbzxyL12.com>
<ContentPresenter x:Name=www.chengmingdl.com"ExpandSite" DockPanel.Dock="Bottom" Focusable="false" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Primitives:ExpandableContentControl>
</DockPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="false">
<Setter Property="IsHitTestVisible" TargetName="ExpandableContentControl" Value="False"/>
</Trigger>
...
</ControlTemplate.Triggers>
我在迁移完数据进行查询的时候发现一个特别有意思的现象,同一条SQL如果分区键的时间区间不一样,它会根据rows行数少的走不同的范围索引。至于它底层是怎么实现的我就没去研究了
三、分区管理
简单介绍了下范围分区,接下来说一下对分区常用的一下操作。
分区管理包括对于分区的增加,删除,以及查询。更多详见官方文档MySQL 分区管理
1.增加分区
对于RANGE和LIST分区:
alter table table_name add partition (partition p0 values ...(exp))
#例
ALTER TABLE members ADD PARTITION (TO_DAYS(www.hengxyul.com'2021-03-01'));
2.删除分区
删除了分区,同时也将删除该分区中的所有数据。如果删除了分区导致分区不能覆盖所有值,那么插入数据的时候会报错。
alter table table_name drop partition p0;
3.查询有多少个分区
SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'members';
四、数据迁移
前面说了那么多概念,我说一下本次把大表数据迁移到分区表的过程。
为什么会选择DTS呢?因为它可以不停机迁移数据,支持全量迁移和增量迁移,对原表影响不大。
迁移过程如下:
首先在RDS的同一个实例里面新建了一张同结构的分区表
使用DTS创建迁移任务,迁移时候不要选择结构钱谦益,只选择全量+增量迁移
然后还需要编辑下目标库表名,也就是做下映射从A->B的迁移
停掉写入数据的任务,当任务队列为空时,等待几分钟暂停并结束迁移任务
最后修改表名,完成数据迁移和切换(我在测试环境修改分区表名要一些时间,但RDS修改表名是秒改)
参考官方文档:MySQL 5.6 分区
以上纯属个人观点,如有不对欢迎指正。
转载于:https://www.cnblogs.com/qwangxiao/p/11241627.html
MySQL--RDS下的分区表实践相关推荐
- mysql sum计算效率很慢_MySQL--RDS下的分区表实践(文末附MySQL视频教程与面试题)...
实践背景 项目中有的表空间太大,且行数太多,故决定对一些表进行分库分表.再研究选型方案的时候发现常用的一些分库分表的解决方案对业务代码修改较多,故决定采用MySQL的分区方案. 其实在我个人看来,分区 ...
- 一个阿里云 MYSQL 服务 RDS 下的查询优化
因MYSQL 现在业务量不大,使用也不多,为了便捷及安全考虑.就不再自己架构数据库了,直接放到的阿里的RDS 服务中. 但前几天开发的测试下来,总说RDS还不如自己测试库压测快. 查看了RDS下的数据 ...
- mysql rds 定时执行_RDS下执行SQL小脚本
RDS下执行SQL小脚本 #!/bin/bash echo ' =============================== - 生产操作谨慎执行 - - - 提前预置SQL文件 - - ===== ...
- sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...
先看下面这条语句,它实现的功能是将特定日期的数据从mysql表中直接导入hive $ sqoop import \ --connect jdbc:mysql://192.168.xx.xx:3306/ ...
- mysql乐观锁总结和实践
2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些 ...
- Python 基于Python从mysql表读取千万数据实践
基于Python 从mysql表读取千万数据实践 by:授客 QQ:1033553122 场景: 有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...
- [转]SQL Server 2005 分区表实践——建立分区表(partition table)
[鹏城万里] 发表于 www.sqlstudy.com SQL Server 2005 分区表实践--建立分区表(partition table) 问题:有一个订单表 Orders,要转换成分区表,以 ...
- mysql乐观锁总结和实践--转
原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...
- 偷梁换柱 | 无备份情况下的数据恢复实践(二)
黄玮(Fuyuncat) ♥ 资深 Oracle DBA,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 个人网站 www.HelloDBA.com 在 数据恢复实践(一)中, ...
最新文章
- linux apache守护进程,Linux基础命令---httpd守护进程
- react 组件连动效果_React组件开发中常见的陷阱
- 为app录制展示gif
- Ubuntu安装apache+Yii2
- iOS:步进UIStepper、滑动块UISlider、开关UISwitch的基本使用
- vc++ 提取网页上的文字_网页内容不让你复制?老师傅教的这招太绝了,1键提取全网文字...
- 如何保证input的输入值不会随着提交 而变空_如何对web界面的应用进行测试?
- delphi switch语句例子_「GCTT 出品」Go 系列教程——10. switch 语句
- mysql建表后添加约束_MYSQL建表完成之后添加约束
- linux 占用缓存前10_Ogre的不足与改进(Ogre2.0设计方案)-1.缓存优化
- 【已解决】SyntaxError: Non-UTF-8 code starting with ‘\xe4‘ in file
- Android Preference 的使用
- 算法基础部分4-深度优先搜索
- TCP 协议学习小结
- 软件工程——毕业论文管理系统
- vue实现留言板的功能_vue初探-简易留言板
- “最新”手机号码归属地库制作
- 计算机颜色显示器,电脑显示器怎么选,看这一篇就够了
- 汉语编程联姻大中院校
- 多闪遭起诉:头条与腾讯社交战争升级背后的难隐之痛